Tkinter按钮没有出现,对不起,伙计们,我知道线程已经存在



按钮不会出现,有什么提示吗?。屏幕截图功能很好,但按钮不行,我有自己关闭它。

import time
from tkinter import *
import pyautogui
class App:
def __init__(self, master, task):
frame = Frame(master)
frame.pack()
self.button = Button(
frame, text="QUIT", fg="red", command=frame.quit
)
self.button.pack(side=LEFT)
frame.after(0,task)
def task():
i = 1
while i > 0:
myScreenshot = pyautogui.screenshot()
myScreenshot.save(r"C:UserselsinDesktoppythonnameTask" + str(i) + ".png")
time.sleep(2)
i += 1
root = Tk()
app = App(root,task())
root.mainloop()

错误:

C:UserselsinPycharmProjectspythonProjectvenvScriptspython.exe C:/Users/elsin/PycharmProjects/pythonProject/1.py
Traceback (most recent call last):
File "C:UserselsinPycharmProjectspythonProject1.py", line 28, in <module>
app = App(root,task())
File "C:UserselsinPycharmProjectspythonProject1.py", line 23, in task
time.sleep(2)
KeyboardInterrupt
Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)

首先:您必须发送不带()的函数名称。

此时此刻,你有了类似的东西

result = task()
app = App(root, result)

但是task()运行while-循环,该循环一直运行,并且代码从未到达App(root, result)-行,因此它不能显示它。

如果您发送函数的名称,那么您将遇到另一个问题——您的frame.after(0, task)立即启动此任务,它会阻塞其余的代码。

如果您使用一些延迟frame.after(100, task),那么它将有时间显示带有按钮的窗口。

但运行while-循环的task仍然存在问题,它阻塞了主循环andtkinter`被冻结。


主要问题是有两个循环必须同时工作:

  • 第一个:CCD_ 11
  • 第二个:while循环

并且这需要在分离的线程中运行其中一个,或者您必须使用root.after(2000, task)而不是while+sleep()

BTW:您应该使用master.destroy而不是frame.quit来停止tkinter程序

import time
import tkinter as tk  # PEP8: `import *` is not preferred
import pyautogui
class App:
def __init__(self, master, task):
frame = tk.Frame(master)
frame.pack()
self.button = tk.Button(frame, text="QUIT", fg="red", command=master.destroy)
self.button.pack(side='left')

frame.after(100, task, 1)
def task(i):
myScreenshot = pyautogui.screenshot()
myScreenshot.save(r"C:UserselsinDesktoppythonnameTask" + str(i) + ".png")
i += 1
root.after(2000, task, i)
root = tk.Tk()
app = App(root, task)
root.mainloop()

最新更新