如何在变量中存储按钮的值?(Python Gtk)
我需要将单击的按钮的值存储到变量中。所以我需要把按钮和变量连接起来,我怎么能做到呢?以下是我的变量:如何在变量中存储按钮的值?(Python Gtk),python,gtk,Python,Gtk,我需要将单击的按钮的值存储到变量中。所以我需要把按钮和变量连接起来,我怎么能做到呢?以下是我的变量: self.first_num = 0 self.second_num = 0 self.result = 0 self.operation = "" 然后我需要在这个函数中使用它们,例如,在一个附加项中: def equal_clicked(self, result): if self.operation == "plus": s
self.first_num = 0
self.second_num = 0
self.result = 0
self.operation = ""
然后我需要在这个函数中使用它们,例如,在一个附加项中:
def equal_clicked(self, result):
if self.operation == "plus":
self.result = self.first_num + self.second_num
self.entry.set_text(self.result)
def button2_clicked(self, button2):
self.entry.set_text(self.entry.get_text() + str(2))
我希望这是足够的代码,向您展示我的问题,我将感谢您的回答
button5 = Gtk.Button(label="5")
button5.connect("clicked", self.button_clicked)
vbox.pack_start(button5, True, True, 0)
vbox.pack_end(button5, True, True, 0)
self.add(button5)
我经常为工作制作GUI应用程序。其主要思想是为每个按钮绑定一个函数,但为每个按钮传递不同的变量 下面是Python Gtk的完整示例:
import pygtk
import gtk
class Example:
def __init__(self):
#Setup window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_border_width(10)
self.boxSizer = gtk.HBox(False, 0)
#Create widgets
self.button1 = gtk.Button("1")
self.button2 = gtk.Button("2")
self.button3 = gtk.Button("3")
self.buttonPlus = gtk.Button("+")
self.buttonEqual = gtk.Button("=")
self.entry = gtk.Entry(max=0)
#Bind Events to a single function
#You would do this for every button.
#The first parameter in the connect() function is the name,
#the second is the function you are binding,
#and the third is the argument we are passing into the function.
self.button1.connect("clicked", self.button_clicked, 1)
self.button2.connect("clicked", self.button_clicked, 2)
self.button3.connect("clicked", self.button_clicked, 3)
self.buttonPlus.connect("clicked", self.button_clicked, "+")
self.buttonEqual.connect("clicked", self.button_clicked, "=")
#Build Window
self.window.add(self.boxSizer)
self.boxSizer.pack_start(self.button1, True, True, 0)
self.boxSizer.pack_start(self.button2, True, True, 0)
self.boxSizer.pack_start(self.button3, True, True, 0)
self.boxSizer.pack_start(self.buttonPlus, True, True, 0)
self.boxSizer.pack_start(self.buttonEqual, True, True, 0)
self.boxSizer.pack_start(self.entry, True, True, 0)
#Show objects
self.button1.show()
self.button2.show()
self.button3.show()
self.buttonPlus.show()
self.buttonEqual.show()
self.entry.show()
self.boxSizer.show()
self.window.show()
def button_clicked(self, widget, value):
"""Your first function and second function could be combined like this.
What this would do is have a single function that is bound to each button.
The arguments passed into it would be different for each button.
Despite using the 'evil eval' function, I figure this is the route you are going.
This removes the need to (1) have a different function for each button,
and (2) you do not need to store values in variables like this:
self.first_num = 0
self.second_num = 0
self.operation = ""
Your code will be cleaner and easier to modify for future projects.
"""
if (value != None):
if (value != "="):
#Add something to the text
self.entry.set_text(self.entry.get_text() + str(value))
else:
#Evaluate the text
self.result = eval(self.entry.get_text())
self.entry.set_text(str(self.result))
else:
#Clear the text
self.entry.set_text("")
def main(self):
gtk.main()
if __name__ == "__main__":
example = Example()
example.main()
这个概念应该适用于任何GUI创建包。不过,有些软件包可能比其他软件包需要更多的工作。 例如,wxPython不允许将参数传递到函数中。你可以按照《弗洛里安·博世》上的话来绕过这个限制。 (注意:此方法适用于任何不允许将参数传递到绑定函数的GUI包) 对于,wxPython:按如下方式绑定所有按钮:
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "1"), button1)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "2"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "3"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "4"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "5"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "6"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "7"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "8"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "9"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "0"), button2)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "+"), buttonAdd)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "-"), buttonSubtract)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "*"), buttonMultiply)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "/"), buttonDivide)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, "="), buttonEqual)
self.Bind(wx.EVT_BUTTON, lambda event: button_clicked(event, None), buttonClear)
(使用此部分:lambda事件:按钮\u单击(事件,“1”)
代替通常将按钮连接到函数的位置。)
无论使用何种GUI模块,这里的想法都是绑定单个函数
到所有计算器的按钮,只需为每个按钮传入不同的值。我猜您正在制作类似计算器的东西?我不确定按钮的值是什么意思,因为按钮不能保存值,但如果您的意思是使用每个数字按钮的数字,只需设置一个回调函数,连接到单击的
信号,然后用硬编码到每个回调中的静态数字初始化变量。因此,我为按钮添加了数字为“2”的函数。我必须初始化该函数中的变量吗?还是我想错了?顺便说一句,是的,我正在用计算器。那会有用的。您也可以使用原始计划,单击该按钮时,只需将self.first_num
设置为2。不过,答案似乎是可行的。我不使用Python,所以我没有Python lambdas方面的经验,所以我在问题中添加了一个按钮的定义。走这条路对吗?我不明白如何或在哪里定义按钮函数中的值?顺便说一句,谢谢你的回答。我对Python Gtk做了一些研究。看起来绑定函数比wxPython更容易。我在回答中添加了更多信息。谢谢你的回答。所以我试着使用代码,我改变了一些事情,但它不起作用。对我来说,这是一个解决方案,我只需要改变一些东西。你试过代码了吗?我对代码做了一些修改,你可以在上面看到。这就是我以前绑定按钮的方式。我下载了PythonGTK并为您创建了一个简单的工作示例。我希望这有帮助。