如果内容违规了提醒我自删谢谢。
利用 pygame 写了一个窗口,里面使用了一个开启新线程,调用HELP模块用于打开一个 tkinter 窗口并用text控件展示图片的功能。
HELP模块单独运行一切正常,但是放在主程序中,当执行到打开新线程并调用HELP.h的时候,却报错 :
RuntimeError: main thread is not in main loop
C:\Users\Administrator\.virtualenvs\MathVisualization-7GIzdkmF\Scripts\python.exe C:\Users\Administrator\Desktop\MathVisualization\math_visualization.py
pygame 2.1.2 (SDL 2.0.18, Python 3.8.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
Exception in thread Thread-1:
Traceback (most recent call last):
File "f:\sai\python3.8.0\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "f:\sai\python3.8.0\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Administrator\Desktop\MathVisualization\HELP.py", line 13, in h
help1=tk.PhotoImage(file=resurce_path(r"resourses\help.gif")) #传入教程图片
File "f:\sai\python3.8.0\lib\tkinter\__init__.py", line 4061, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "f:\sai\python3.8.0\lib\tkinter\__init__.py", line 4006, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
RuntimeError: main thread is not in main loop
进程已结束,退出代码0
这是主程序(内涵注释,如果看不懂可以评论告诉我)(其中 key_help 是本人写得一个在窗口显示按键的类,他与本次报错没有关系,大家可以略过)
import sys
from init import * # 一个属于按键的类Key就定义在里面
from HELP import h # 要用分支线程打开的函数
import os
import pygame
from threading import Thread
import extend_input
pygame.init()
screen=pygame.display.set_mode((800,800))
key_help=Key(screen,r"resourses\key",500,64,font_mufferaw[45],WHITE,"help") #定义help按键外观
key_help.setCenter()
key_help.moving(0,20)
key_help.nameCenter()
# 确定按键放置位置
run=True
while run:
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
if event.type==pygame.MOUSEBUTTONDOWN:
if key_help.state:
key_help.click()
H=Thread(target=h,daemon=True) # 定义一个分支守护线程,实现打开 h 函数且不暂停运行主程序,两个线程同时进行,主程序结束 守护子线程也结束
H.start()
screen.fill(BLACK)
key_help.update(pygame.mouse.get_pos())
key_help.draw()
pygame.display.flip()
这是需要用新线程打开的HELP文件:
import tkinter as tk
import sys
from os import path
def resurce_path(relative_path):
base_path=getattr(sys,'_MEIPASS',path.dirname(path.abspath(__file__)))
return path.join(base_path,relative_path)
# 在一个tkinter窗口使用text控件展示一张图片
def h():
help = tk.Tk()
help.geometry("800x800")
helptext =tk.Text(help,width=120, height=70) #创建文本框
helptext.place(x=0,y=0)
help1=tk.PhotoImage(file=resurce_path(r"resourses\help.gif")) #传入图片
helptext.image_create(tk.INSERT,image=help1) #在文本框中插入图片
help.mainloop() #显示窗口
if __name__=='__main__':
h()
本人经过调试发现,问题主要出在HELP文件中的函数h中,传入和插入图片的那两句话,把那两句话去掉程序正常运行,但是加上就会报错。
希望各位可以帮我分析一下,谢谢!!