[英]Why does my button only work once in Python?
我創建了一個按鈕,以在單擊main_menu函數時將其調用,但只能單擊一次。 單擊該按鈕后,它將使用戶返回主菜單,但是如果用戶離開主菜單並再次單擊它,則它什么也不做。
def __init__(self):
self.main = main
self.main.grid()
<Really long tuple declared here>
self.main_menu()
def main_menu(self):
self.main.grid_remove()
main = Frame(root)
self.main = main
self.main.grid()
self.sort_button = Tkinter.Button(main, text = "Sort the list using the bubble sort method", command = self.sort_choice)
<Some more buttons coded here>
self.sort_button.pack()
def sort_choice(self):
self.main.grid_remove()
main = Frame(root)
self.main = main
self.main.grid()
<Some other buttons and messages coded here>
self.main_menu.pack()
我如何才能使按鈕多次工作?
如評論中所述,發布的代碼未表示預期的行為,並且可能應更改代碼的整個結構(並使用適當的命名)。 我嘗試清除一些概念,但是此答案不能使此代碼有效(甚至可能無法執行)。
如果您正在使用全局變量(我假設main應該是全局變量),則當您想在函數中更改它們的值時,需要使用全局構造對其進行聲明。 否則,在函數中更改全局變量的值將創建具有相同名稱的局部變量,並且不會影響全局變量。
這是清除此問題的簡單代碼段:
val = "x"
def use_global():
print "Global value is: %s" % val
def change_global_wrong():
print "changing global in change_global_wrong"
val = "y"
print "global in change_global_wrong is: %s" % val
def change_global_correct():
global val
print "changing global in change_global_correct"
val = "y"
print "global in change_global_correct is: %s" % val
use_global()
change_global_wrong()
use_global()
change_global_correct()
use_global()
因此,更改函數內部main的值實際上是在創建局部變量,當返回每個函數時它們將超出范圍。 這意味着您對主框架的唯一引用是self.main 。 因此,我建議將其注冊為按鈕的父級。
self.sort_button = Tkinter.Button(self.main, text = "Sort the list using the bubble sort method", command = self.sort_choice)
即使這樣做,通過調用self.main.grid_remove()也可以刪除Frame對象。 這將導致框架(及其子窗口小部件)被刪除。 在這里,我添加了一個Tk應用程序的代碼示例(並按照注釋中的說明,包括一種打破它的方法):
#!/usr/bin/env python
import datetime
from Tkinter import *
class MyApp(object):
def __init__(self):
self.root = Tk()
self.time_var = StringVar()
self.time_var.set('...')
self._init_widgets()
def _init_widgets(self):
self.label = Label(self.root, textvariable=self.time_var)
frame = Frame(self.root)
self.frame = frame
self.button = Button(frame, text = "update time", command = self._on_button_click)
self.frame.grid()
self.button.grid()
self.label.grid()
def _on_button_click(self):
self.time_var.set(str(datetime.datetime.now()))
# uncomment these lines to get a broken code
#self.frame.grid_remove()
#self.frame = Frame(self.root)
#self.frame.grid()
def run(self):
self.root.mainloop()
if __name__ == '__main__':
app = MyApp()
app.run()
現在,如果您取消注釋不良行,您將看到調用grid_remove()會刪除Frame,但是創建新的Frame對象(並將其分配給相同的引用)不會幫助我們恢復。 因為上面有一個漂亮按鈕的舊框架不見了。 可以更新時間的漂亮按鈕也與它的父級一起消失了。
我不確定這個問題中的代碼是否真正運行(因為它缺少上下文和其他行),但是如果它運行了,我希望通過單擊按鈕,可以使主窗口小部件已刪除按鈕也應從小部件中刪除(創建新框架不應恢復按鈕)。
由於這沒有發生(正如您所說的,按鈕正在顯示,但沒有執行任何操作),因此我得出的結論是,此處發布的代碼行未正確表達您的情況。 但是,我希望這些代碼示例可以幫助您更多地了解您的應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.