python-访问绑定到事件的函数的返回值(tkinter)

基本上,我所做的是将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).您可能要考虑切换到那些按钮而不是按钮.

上一篇:Pyqt鼠标悬停在QPushButton上


下一篇:javascript-为什么jQuery File Upload插件的流程事件不触发?