.SAI. 2023-01-18 18:50 采纳率: 100%
浏览 40
已结题

python tkinter与多线程相关问题

如果内容违规了提醒我自删谢谢。

利用 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中,传入和插入图片的那两句话,把那两句话去掉程序正常运行,但是加上就会报错。

希望各位可以帮我分析一下,谢谢!!

  • 写回答

3条回答 默认 最新

  • .SAI. 2023-01-18 20:44
    关注

    已解决。

    由于程序庞大以及本人马蜂不太好,因此在自己编写的自定义库中有些时候会习惯性的写上import tkinter ,以便使用GUI。这本没什么问题,但是在最终的主控制程序中我把这些自定义库都给调用了,也就是说这些自定义库所调用的库也被主程序调用了。这就造成了 tkinter 库在同一个程序(主程序)被多次调用的情况,因此在产生 tk窗口的时候就发生了错误,从而延伸为了线程错误。

    警钟敲烂,像 tkinter 这种奇怪的库在任何程序内只能被直接或间接的调用一次!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月18日
  • 创建了问题 1月18日

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备