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