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

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日

悬赏问题

  • ¥15 目标计数模型训练过程中的问题
  • ¥100 Acess连接SQL 数据库后 不能用中文筛选
  • ¥15 用友U9Cloud的webapi
  • ¥20 电脑拓展屏桌面被莫名遮挡
  • ¥20 ensp,用局域网解决
  • ¥15 Python语言实验
  • ¥15 我每周要在投影仪优酷上自动连续播放112场电影,我每一周遥控操作一次投影仪,并使得电影永远不重复播放,请问怎样操作好呢?有那么多电影看吗?
  • ¥20 电脑重启停留在grub界面,引导出错需修复
  • ¥15 matlab透明图叠加
  • ¥50 基于stm32l4系列 使用blunrg-ms的ble gatt 创建 hid 服务失败