簡體   English   中英

在 python 的 for 循環中調用不同的方法?

[英]Call different methods in a for loop in python?

我正在創建一個骰子生成器來學習 tkinter。 這是我的第一次,所以請多多包涵。 我也試圖在 class 中制作所有內容,盡管我沒有顯示所有代碼,因為有很多。 最終目標是能夠輸入“x”數量的“y”類型骰子(4、6、8 面骰子等,並計算總數。我不是為每種類型的骰子單獨創建一個按鈕,而是嘗試使用 for 循環來簡化它。

class DiceRoller:
    def __init__(self,root):

開頭有很多代碼,但以下都在上述方法中。

self.diceNames = ['D4','D6','D8','D10','D12','D20','D100']

    for x in range(len(self.diceNames)):

        #DEFINE TEXT FOR ENTRY BOX
        self.entryText = 'Roll '+self.diceNames[x]
        #CREATE ENTRY BOX
        self.entryBox = ttk.Entry(self.rollButtonFrame, 
                            width=self.entryWidth,
                            textvariable = self.textvariable).grid(row=self.rollRowStart+x,column=self.entryCol)
        
        #CREATE BUTTONS
        ttk.Button(self.rollButtonFrame, text = self.entryText,
                                         command = self.rollDice).grid(row=self.rollRowStart+x,column=self.rollCol)
        #CREATE LABELS FOR ANSWERS
        ttk.Label(self.rollButtonFrame, text = 'Total: 0').grid(row=self.rollRowStart+x,column=self.answerCol)
        #CREATE LABELS FOR DESCRIPTIONS
        descText = 'Number of '+self.diceNames[x]+' dice: '
        ttk.Label(self.rollButtonFrame, text = descText).grid(row=self.rollRowStart+x,column=self.descCol)
                                         command = self.rollDice).grid(row=self.rollRowStart+x,column=self.rollCol)

這會正確創建按鈕、標簽和輸入框, (請參閱此處)但是我不知道如何為每個骰子調用不同的方法。 我也不知道這是否是最好的方法。 如何根據輸入使每個按鈕的行為有所不同,同時在 for 循環中創建按鈕,如圖所示?

我想如果我可以列出它會起作用的方法,但我不知道它是否可能。

有沒有更好的方法來做到這一點? 提前致謝!

我會為此使用functools.partial

# This assumes self.rollDice takes the name of the target die as the first argument
(ttk.Button(self.rollButtonFrame, text=self.entryText, command=partial(self.rollDice, self.diceNames[x]))
    .grid(row=self.rollRowStart + x, column=self.rollCol))

partial通過提前綁定一些 arguments 創建一個的 function。 再舉一個例子說明這是如何工作的:

roll_d20 = partial(self.rollDice('D20'))
roll_d100 = partial(self.rollDice('D100'))
d20_result = roll_d20()  # This is the same as `d20_result = self.rollDice('D20')`
d100_result = roll_d100()  # This is the same as `d100_result = self.rollDice('D100')`

您可以使用 lambda 來完成同樣的事情:

(ttk.Button(self.rollButtonFrame, text=self.entryText, command=lambda name=self.diceNames[x]: self.rollDice(name))
    .grid(row=self.rollRowStart + x, column=self.rollCol))

然而,這個方法有一個與 Python 的詞法范圍規則相關的常見問題,因此需要默認參數 name= self.diceNames name=self.diceNames[x] 我個人更喜歡partial ,因為我總是最終忘記了 lambdas 的這種行為。

暫無
暫無

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

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