簡體   English   中英

如何從元組將方法傳遞給Tkinter按鈕小部件命令選項

[英]How to pass methods to a Tkinter button widget command option from a tuple

我正在嘗試創建方法列表。 並嘗試是否可以將它們傳遞給按鈕小部件命令選項。我收到錯誤消息

TypeError: 'set' object does not support indexing

我如何在method_pointer元組旁邊為nav_button命令選項分配方法列表。

class ADB(Frame):
       __init_(self,parent):
         sel.parent=parent
         self.nav_button=[]    
         for i in range(0,2):
             self.nav_button.append(Button(self.parent)




       def start(self) :
            ...........

       def setup(self):
            ...........
       self.nav_bttn_y=15
       method_pointer={'self.start','self.setup'}


        for i in range(0,2):

            self.nav_button[i]["command"]= lambda :method_pointer[i]()
            self.nav_button[i].place(x=10,y=self.nav_bttn_y)

            self.nav_bttn_y +=40

問題在於{'self.start','self.setup'}不是一個元組,而是一個set 而且集合沒有排序,因此method_pointer[0]是沒有意義的。

如果要使用元組,只需將括號替換為括號即可:

method_pointer = ('self.start','self.setup')

如果您需要將其作為集合,則無法對其進行索引……但是您仍然可以對其進行迭代(盡管以任意順序),如下所示:

for i, method in enumerate(method_pointer):
    self.nav_button[i]["command"]= lambda: method()
    self.nav_button[i].place(x=10,y=self.nav_bttn_y)
    self.nav_bttn_y +=40

實際上,即使有一個元組,這也是一個好主意。

在執行此操作時,您不需要lambda: method_pointer[i]() ; 它執行的方法與method_pointer[i] ,但是更加method_pointer[i]差且速度慢。 (並且同樣,您不需要lamdba: method() ,而僅是method 。)


但是您還有另一個問題: 'self.start'不是方法,而是字符串。 如果要使用self.start方法,則需要傳遞它,且不帶引號。


因此,將它們放在一起(並修復您的IndentationError ,並對其進行部分PEP8化):

method_pointer = (self.start, self.setup)
for i, method in enumerate(method_pointer):
    self.nav_button[i]["command"] = method
    self.nav_button[i].place(x=10, y=self.nav_bttn_y)
    self.nav_bttn_y += 40

當然,我不能保證這是代碼中的最后一個錯誤,如果您做錯了其他事情,它可能仍然無法工作。 但這至少解決了前三個問題。

暫無
暫無

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

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