簡體   English   中英

為什么我的按鈕在Python中只能使用一次?

[英]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.

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