2016-12-23 10 views
-1

変数にクリックされたボタンの値を保存する必要があります。だから私はどのように私はそれを行うことができます変数とボタンを接続する必要がありますか?ここに私の変数があります:ボタンの値を変数に保存するにはどうしたらいいですか? (Python Gtk)

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) 
+0

電卓のようなものを作っていると思いますか?私は、ボタンが値を保持することができないので、ボタンの値が何を意味するのかは分かりませんが、各数字ボタンから数値を使用することを意味するならば、単に「クリックされた」信号に接続するコールバック関数を設定してください各コールバックにハードコードされた静的な番号で変数を初期化します。 – oldtechaa

+0

ボタンの機能を追加しました。番号は「2」です。その関数の変数を初期化する必要がありますか?あるいは私は間違っていると思いますか?そして、私は電卓を使っています。 –

+0

となります。また、元のプランを使用し、そのボタンがクリックされたときに 'self.first_num'を2つに設定することもできます。答えはそれがうまくいくように見えます。私はPythonを使用しないので、Pythonのlambdaでの経験はありません。 – oldtechaa

答えて

0

私は仕事のために多くのGUIアプリケーションを作成します。主な考え方は、各ボタンに単一の機能をバインドするが、各ボタンで別の変数を渡すことです。

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の作成パッケージのために働く必要があります。ここでは

は、PythonのGtkのための完全な例です。しかし、パッケージによっては、他のものよりも少し時間がかかることがあります。 たとえば、wxPythonでは引数を関数に渡すことはできません。で "Florian Bosch"と言うことで、この制限を回避できます。 (注:このメソッドは、バインド関数に引数を渡すことはできません任意の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 event: button_clicked(event, "1")


ここでの考え方は、関係なく、使用GUIモジュールの、あなたのCALCのすべてに単一の機能 をバインドすることですulatorのボタンをクリックし、各ボタンの異なる値を渡します。

+0

私は質問に1つのボタンの定義を追加しました。これは正しい方法ですか?そして、私はbutton_clicked関数の値を定義する方法や場所を理解していませんか?そして答えに感謝します。 –

+0

私はPython Gtkを少し研究しました。関数をバインドする方がwxPythonの方が簡単なようです。私は私の答えにいくつかの情報を追加しました。 – Kade

+0

答えをありがとう。だから私はコードを使用してみて、いくつかのものを変更しましたが、動作しません。私にとって、これは何かを変えるだけの解決策です。コードを試しましたか? –

関連する問題