簡體   English   中英

Tkinter 按鈕沒有出現,對不起,我知道一個線程已經存在

[英]Tkinter button does not appear, sorry guys I know that a thread already exists

它沒有出現的按鈕,有什么提示嗎? 屏幕截圖功能可以正常工作,但按鈕不行,我必須自己關閉它。

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:\Users\elsin\Desktop\python\nameTask" + str(i) + ".png")
        time.sleep(2)
        i += 1

root = Tk()

app = App(root,task())
root.mainloop()

錯誤:

C:\Users\elsin\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/elsin/PycharmProjects/pythonProject/1.py
Traceback (most recent call last):
  File "C:\Users\elsin\PycharmProjects\pythonProject\1.py", line 28, in <module>
    app = App(root,task())
  File "C:\Users\elsin\PycharmProjects\pythonProject\1.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 -loop 一直運行並且代碼永遠不會進入行App(root, result) - 所以它無法顯示它。

如果您發送函數的名稱,那么您將遇到另一個問題 - 您的frame.after(0, task)立即啟動此任務並阻止 rest 代碼。

如果您使用一些延遲frame.after(100, task)那么它將有時間用按鈕顯示 window 。

但是它仍然存在運行while -loop 並且阻塞的task的問題 mainloop and tkinter` 被凍結。


主要問題是您有兩個必須同時工作的循環:

  • 第一個: mainloop()
  • 第二: while循環

這需要在單獨的線程中運行其中一個,或者您必須使用root.after(2000, task)而不是while + sleep()

順便說一句:您應該使用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:\Users\elsin\Desktop\python\nameTask" + str(i) + ".png")
    i += 1
    root.after(2000, task, i)

root = tk.Tk()
app = App(root, task)
root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM