基本上,我所做的是将click事件绑定到一个函数.例如:
self.button1.bind("<Button-1>",self.chooseDice)
我现在想要的是在另一个函数中访问choiceDice()的结果.这样做的最佳方法是什么?
class GraphicsInterface:
#we want to initialize the game board here, set up the dice and buttons
def __init__(self):
self.window = Tk()
self.window.geometry("720x500")
#buttons under each die
self.clicked=[] #empty list to collect all the buttons that were clicked (see chooseDice function)
self.button1 = Button(self.window, text="Dice 1", width=13) #create the button object
self.button1.place(x=60, y=160)
#bind button click event to a function (chooseDice())
self.button1.bind("<Button-1>",self.chooseDice)
self.button2 = Button(self.window, text="Dice 2", width=13)
self.button2.place(x=185, y=160)
self.button2.bind("<Button-1>",self.chooseDice)
#using the event as an argument, append the text to the clicked list
def chooseDice(self, event):
self.clicked.append(event.widget.cget('text'))
self.diceList=[] #create a new empty list
for i in range(len(self.clicked)):
self.diceList.append(int(self.clicked[i][5])) #get just the int value of the last character (i.e. the dice number)
self.deactivate(event.widget) #deactivate the button
return self.diceList
解决方法:
您已经在做您需要做的事情.您的示例代码将self.diceList设置为某个值.您可以在代码的任何其他位置直接使用self.diceList.
顺便说一句-您正在编写的代码随着时间的推移将很难维护.例如,如果将骰子标签更改为“骰子一”或只是将“骰子”更改为“骰子1”,该怎么办?或者,随着应用程序的进行,您可能需要图形图像而不是按钮上的文本.您必须修改解析按钮名称的代码.您实质上是在按钮标签中编码信息,这不是一个好主意.
一个简单的解决方案是在回调中传入骰子编号,这也使您的choiceDice方法更简单易懂.例如:
self.button1.configure(command=lambda btn=self.button1: self.chooseDice(btn, 1))
上面的代码将两个参数传递给choiceDice方法:按钮实例(因此您可以将其禁用)和按钮编号(因此您不必解析按钮名称即可获取它)
这也使您可以循环创建骰子,而不用硬编码同一代码块的多个副本.这是一个完整的工作示例:
from Tkinter import *
class GraphicsInterface:
def __init__(self):
self.window = Tk()
self.window.geometry("720x500")
self.clicked=[]
self.buttons = []
for n in range(1, 3):
btn = Button(text="Button " + str(n))
btn.configure(command=lambda btn=btn, n=n: self.chooseDice(btn, n))
btn.pack()
self.buttons.append(btn)
btn = Button(text="Go!", command=self.go)
btn.pack()
self.window.mainloop()
def go(self):
print "buttons:", self.clicked
self.reset()
def reset(self):
'''Reset all the buttons'''
self.clicked = []
for button in self.buttons:
button.configure(state="normal")
def chooseDice(self, widget, number):
self.clicked.append(number)
widget.configure(state="disabled")
app = GraphicsInterface()
最后,最后一些建议:
不要使用place,它会使您的GUI更加难以创建,并且它们对窗口大小的更改,字体的更改,平台的更改等将无法很好地做出反应.请改用pack和grid.另外,请勿创建固定宽度的按钮.同样,这是为了更好地处理字体更改.有时您需要固定宽度的按钮,但看起来您的代码没有任何理由使用它们.
最后,我不知道您实际上要完成什么,但是通常如果您使用按钮来跟踪状态(是否按下此按钮?),则要使用复选框(选择N个N)或单选按钮(从N中选择1).您可能要考虑切换到那些按钮而不是按钮.