單擊后如何更改在 Python 中使用 TTK 制作的按鈕的狀態?我想在按下一次按鈕 START 后禁用它,并在按下 STOP 后重新啟用它。我想要這個,因為我的代碼每次按 Start 時都會創建一個新的重復執行緒......所以......我想禁用它......我使用 TTK 而不是 TK 因為我看到它看起來更好但我似乎無法弄清楚如何使用一個全域變數,在我按下它后,它只會翻轉該 START 按鈕的狀態......
例子 :
frm2=ttk.Button(frm, text="Start", command=start_button).grid(column=0, row=3)
這是我的整個腳本,所以你可以自己運行它,看看我的意思......
from tkinter import *
from tkinter import ttk
import pyautogui
import keyboard
import time
import threading
gvar = False
def imagedetect():
while gvar:
if pyautogui.locateOnScreen('image.png', confidence = 0.9) != None:
print("I can see it")
time.sleep(1)
else:
print("I am unable to see it")
time.sleep(1)
#root.after(1000,imagedetect)
def start_button():
global gvar
gvar = True
th_runner = threading.Thread(target=imagedetect, daemon=True)
th_runner.start()
def on_start():
global gvar
gvar = True
def on_stop():
global gvar
gvar = False
def help():
filewin = Toplevel(root, padx=50,pady=50)
information = Label(filewin, text="App made by ..... you can close the app after starting it by pressing the key Q")
information.pack()
root = Tk()
root.title("Rename me later")
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Help", command=help)
filemenu.add_separator()
menubar.add_cascade(label="Info", menu=filemenu)
frm = ttk.Frame(root, padding=30)
frm.pack()
ttk.Label(frm, text="App made by uknown").grid(column=1, row=0)
frm2=ttk.Label(frm, text="").grid(column=0, row=1)
frm2=ttk.Label(frm, text="").grid(column=1, row=1)
frm2=ttk.Label(frm, text="").grid(column=2, row=1)
frm2=ttk.Label(frm, text="").grid(column=0, row=2)
frm2=ttk.Label(frm, text="").grid(column=1, row=2)
frm2=ttk.Label(frm, text="").grid(column=2, row=2)
frm2=ttk.Button(frm, text="Start", command=start_button).grid(column=0, row=3)
frm2=ttk.Button(frm, text="Stop", command=on_stop).grid(column=1, row=3)
frm2=ttk.Button(frm, text="Quit", command=root.destroy).grid(column=2, row=3)
#root.destroy
root.config(menu=menubar)
#imagedetect()
root.mainloop()
uj5u.com熱心網友回復:
為什么您對多個小部件使用相同的變數?它不能那樣作業,因為一個變數只能包含一個值。如果您想稍后更改按鈕狀態,則必須有單獨的變數名稱。此外,您首先必須創建一個按鈕,然后對其進行網格化。不要在一行中執行它們,因為您看到 grid 回傳 none,這意味著您實際上在變數而不是小部件類中存盤了 none。
要更改按鈕的狀態,請執行此操作btn.config(state=DISABLED OR NORMAL)
這應該有效:
from tkinter import *
from tkinter import ttk
import pyautogui
import keyboard
import time
import threading
gvar = False
def imagedetect():
while gvar:
if pyautogui.locateOnScreen('image.png', confidence = 0.9) != None:
print("I can see it")
time.sleep(1)
else:
print("I am unable to see it")
time.sleep(1)
#root.after(1000,imagedetect)
def start_button():
global gvar, btn
btn.config(state=DISABLED)
gvar = True
th_runner = threading.Thread(target=imagedetect, daemon=True)
th_runner.start()
def on_start():
global gvar
gvar = True
def on_stop():
global gvar
btn.config(state=NORMAL)
gvar = False
def help():
filewin = Toplevel(root, padx=50,pady=50)
information = Label(filewin, text="App made by ..... you can close the app after starting it by pressing the key Q")
information.pack()
root = Tk()
root.title("Rename me later")
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Help", command=help)
filemenu.add_separator()
menubar.add_cascade(label="Info", menu=filemenu)
frm = ttk.Frame(root, padding=30)
frm.pack()
ttk.Label(frm, text="App made by uknown").grid(column=1, row=0)
# You may need to change the names of these variables
frm2=ttk.Label(frm, text="").grid(column=0, row=1)
frm2=ttk.Label(frm, text="").grid(column=1, row=1)
frm2=ttk.Label(frm, text="").grid(column=2, row=1)
frm2=ttk.Label(frm, text="").grid(column=0, row=2)
frm2=ttk.Label(frm, text="").grid(column=1, row=2)
frm2=ttk.Label(frm, text="").grid(column=2, row=2)
btn=ttk.Button(frm, text="Start", command=start_button) # Button is a class not a nonetype
btn.grid(column=0, row=3)
frm2=ttk.Button(frm, text="Stop", command=on_stop).grid(column=1, row=3)
# This below is what 'frm2' will be equal to at the end so other widgets are lost so if need to use them later then you have to have seperate variables
frm2=ttk.Button(frm, text="Quit", command=root.destroy).grid(column=2, row=3)
#root.destroy
root.config(menu=menubar)
#imagedetect()
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/518300.html
標籤:Pythontkinterpyautoguittkttkwidgets
