我正在制作一個石頭剪刀布程式,當他們單擊按鈕時,我需要更改輪到誰,但我不想使用 global 關鍵字,因為該程式位于函式內部。
這是我在不使用 global 關鍵字的情況下嘗試執行的示例:
from tkinter import *
root = Tk()
var = 1
def buttonClick():
global var
var = 1
print(var)
button = Button(root, text="button", command=buttonClick).pack()
root.mainloop()
我試過寫command=(var = 1),但沒有奏效。
uj5u.com熱心網友回復:
不,你確實不能。例如,如果它是一個串列,則可以更改全域的內容。var然后你可以把你的命令寫成一個沒有完整函式體的 lambda 運算式。
但這根本不是最好的設計。
Tkinter 事件模型與 Python 物件模型很好地結合在一起——在某種程度上,你可以在一個類中包含所有與 UI 相關的東西,而不是僅僅將你的 UI 組件放在頂層(所有全域的),由稀疏函式協調——即使它曾經有只有一個實體 - 這樣您的程式可以將 var 作為“self.var”訪問,將命令作為“self.button_click”訪問,如果他們不應該這樣做,那么幾乎不會有事情搞砸的危險。
只是您發現的大多數檔案和教程都將包含繼承 tkinter 物件本身的 OOP 示例,并將您的元素添加到現有類的頂部。我強烈反對這種方法:tkinter 類足夠復雜,有數百種方法和屬性——即使是一個復雜的程式也只需要幾十個內部狀態讓你擔心。
最好的事情是關聯:所有你想要訪問的東西都應該是你班級的成員。在您的程式開始時,您實體化您的類,這將創建 UI 元素并保留對它們的參考:
import tkinter as tk # avoid wildcard imports: it is hard to track what is available on the global namespace
class App:
def __init__(self):
self.root = tk.Tk()
self.var = 1
# keep a refernce to the button (not actually needed, but you might)
self.button = tk.Button(self.root, text="button", command=self.buttonClick)
self.button.pack()
def buttonClick(self):
# the button command is bound to a class instance, so
# we get "self" as the object which has the "var" we want to change
self.var = 1
print(self.var)
def run(self):
self.root.mainloop()
if __name__ == "__main__": # <- guard condition which allows claases and functions defined here to be imported by larger programs
app = App()
app.run()
uj5u.com熱心網友回復:
如果整個腳本在函式(包括buttonClick()函式)內,則使用nonlocal關鍵字:
def buttonClick():
nonlocal var
var = 1
print(var)
如果函式沒有嵌套,唯一的方法是在兩個函式中創建一個全域變數和global關鍵字。
uj5u.com熱心網友回復:
是的你可以。這是一種 hacky 方法,說明它可以完成,盡管它肯定不是做這些事情的推薦方法。免責宣告:我從一個相關問題的答案中得到了這個想法。
from tkinter import *
root = Tk()
var = 1
button = Button(root, text="button",
command=lambda: (globals().update(var=var 1), print(var)))
button.pack()
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/436164.html
上一篇:用戶登錄后,我如何才能從登錄螢屏導航到應用程式......本機反應
下一篇:如何將GUI匯入python腳本
