【发布时间】:2021-01-22 17:37:29
【问题描述】:
我有一个复杂的程序,我在我的 tkinter 主循环中运行多个任务。我的程序正在运行,但是我遇到了一个烦人的问题,除非任务完成,否则我无法停止任务。我开发了一个简单的 tkinter 程序来显示这个问题:
完整代码:
import tkinter as tk
from tkinter import Button,Entry,Canvas,Label,ttk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
def Create_canvas(self,canvas_width,canvas_height):
global canvas#described as global because used outside class
canvas = tk.Canvas(self.master,bg='papaya whip',width=canvas_width,height=canvas_height)
def Application_Intro(self):
print("starting new app")
restart_program_button = tk.Button(canvas, text="Restart_program",font='Helvetica 12 bold', width=20, height=2, command =self.Restart)
start_program_button = tk.Button(canvas, text="Start_program",font='Helvetica 12 bold', width=20, height=2, command =self.Start_program)
canvas.create_text(960,20,text="MY PROGRAM",font='Helvetica 16 bold')
canvas.create_window(710,300,window = restart_program_button)
canvas.create_window(710,500,window = start_program_button)
canvas.pack()
self.master.mainloop()
def Start_program(self):
print("Program start")
self.master.after(1000,self.Start_program)
def Restart(self):
#self.master.destroy()
#self.master.quit()
print("HERE I WANT TO INTERRUPT START PROGRAM AND RETURN TO IDLE STATE")
#WHAT TO DO IN THIS FUNCTION TO GO BACK TO INITIAL MAINLOOP STATE??
return
master = tk.Tk()
app = Application(master=master)
app.Create_canvas(1920,1080)
app.Application_Intro()
上面的程序将创建一个带有 2 个按钮的简单 GUI。最初,程序将空闲并等待用户启动应用程序。当应用程序启动时,它会递归调用自己(检查各种状态并在我的真实程序中执行其他复杂操作),但是,我希望能够随时中断此操作并停止它。这就是为什么我创建了一个按钮“RESTART”,它应该将程序重新启动到我正在等待用户重新启动和应用程序的初始状态。按下按钮后如何退出 Start_program 函数?
除了 master.destroy() 或 master.quit() 之外,我真的无法在互联网上找到相关信息。
master.destroy() 完全破坏了我的主循环,这不是我想要的,而且调用 master.quit() 似乎什么也没做。
添加图片网址以便您更容易理解: https://ibb.co/djMd5TW
【问题讨论】:
-
如果“程序运行良好”,那么您的问题是什么?看起来,您已经完成了您想要完成的工作,但需要一般性建议才能做得更好。您必须具体才能真正获得帮助。
-
正如你所说。我希望从有更多 tkinter 经验的人那里得到建议,并且可以给我一般性建议,这是否是处理窗口的有效方法,因为我觉得每次开始新操作时销毁和重建新窗口的效率都不是很高(可以每 30 秒或类似的时间启动一个新操作)
-
当应用程序在桌面上运行时,定期销毁窗口不会有什么问题。更令人担忧的是,您似乎正在运行不止一个
Tk()实例(login_screen和window)。 -
感谢您的回复。我正在使用 Tk() 登录屏幕的单个实例是顶层窗口。它在登录窗口中创建如下:
global login_screen login_screen = TopLevel(window) -
你应该很高兴。应用程序运行后,您可能需要重新对其进行重构。但首先让它发挥作用,你似乎已经拥有了。
标签: python python-3.x user-interface tkinter raspberry-pi