2011-07-01 24 views
2

私はTkinterモジュールを使ってPythonでGUIを作成しようとしていますが、その一部には2つのラジオボックスのオプションを与え、どちらを選択するかが含まれます。彼らはチェックボックスに応じて、別の結果を返す異なる関数を実行します。結果はウィンドウクラス外で使用したいのです。しかし、クラスの中からクラスの外に値を送る方法はわかりません。私はそれがかなりシンプルだと確信していますが、私の人生はそれを解決することができません。Tkinterのラジオボックスから値を取得する - Python

私の現在のコードは次のとおり

class BatchIndiv(): 
def __init__(self, master): 
    self.master=master 
    self.startwindow() 
    self.b=0 

def startwindow(self): 

    self.var1 = IntVar() 
    self.textvar = StringVar() 

    self.Label1=Label(self.master, text="Batch or indivdual import?") 
    self.Label1.grid(row=0, column=0) 

    self.Label2=Label(self.master, textvariable=self.textvar) 
    self.Label2.grid(row=2, column=0) 

    self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1, 
          value=1, command=self.cb1select) 
    self.rb1.grid(row=1, column=0, sticky=W) 

    self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1, 
          value=2, command=self.cb1select) 
    self.rb2.grid(row=1, column=1, sticky=W) 

    self.Button1=Button(self.master, text="ok", command=self.ButtonClick) 
    self.Button1.grid(row=1, column=2) 

def ButtonClick(self): 
    if (self.var1.get())==1: 
     b=BatchImport() 
     return b 
     self.master.quit() 
     self.master.destroy() 
    elif (self.var1.get())==2: 
     b=IndivImport() 
     return b 
     self.master.quit() 
     self.master.destroy() 
    else: pass 

def cb1select(self): 
    return self.var1.get() 

#End of class definition. 
#Code: 

root=Tk() 
window=BatchIndiv(root) 
b=BatchIndiv.ButtonClick.b 
root.mainloop() 

.... 

)は、それらがちょうど私がButtonClick(内部変数bに割り当てた整数値を返す、ブラックボックスとしてBatchImportとIndivImport機能を扱います。私はroot.mainloop()の下で(つまりどこに....あるのか)いくつかのことをするにはその価値が必要ですが、それをどうやって取得するのか分かりません。 Tkinterは本当にとても刺激的です。特に、誰もがさまざまな方法を使ってオンライン文書が決して同じではないように、さまざまな方法で書かれたものを試してみると、もっと素敵なエラーメッセージが表示されます。

何かすべてのヘルプは高く評価されます。

PS - ボタンを押したときにウィンドウを閉じることができますが、値bをコードの残りの部分に送り返して、完全にPythonを終了させるだけではありませんか?あなたが見ることができるように、私は.quit()と.destroy()を使ってみましたが、運が無かった。

答えて

1

あなたの変数bは、あなたのクラスにちょうどローカルであるので、あなたのクラスが削除された瞬間(あなたがdestroyquitを行った後)、bが破壊されます。変数bをグローバルとして定義します。

b = 0     # this is now in the global namespace 

class BatchIndiv(): 
    def __init__(self, master): 
     self.master=master 
     self.startwindow() 
     #self.b=0  # no need for this, directly store in the global variable 

    def startwindow(self): 

     self.var1 = IntVar() 
     self.textvar = StringVar() 

     self.Label1=Label(self.master, text="Batch or indivdual import?") 
     self.Label1.grid(row=0, column=0) 

     self.Label2=Label(self.master, textvariable=self.textvar) 
     self.Label2.grid(row=2, column=0) 

     self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1, 
           value=1, command=self.cb1select) 
     self.rb1.grid(row=1, column=0, sticky=W) 

     self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1, 
           value=2, command=self.cb1select) 
     self.rb2.grid(row=1, column=1, sticky=W) 

     self.Button1=Button(self.master, text="ok", command=self.ButtonClick) 
     self.Button1.grid(row=1, column=2) 

    def ButtonClick(self): 
     global b 
     if (self.var1.get())==1: 
      b=BatchImport() 
      self.master.quit() 
      #self.master.destroy() # either quit or destroy, I think one is sufficient, but confirm to be sure. 
     elif (self.var1.get())==2: 
      b=IndivImport() 
      self.master.quit() 
      #self.master.destroy() # either quit or destroy, I think one is sufficient, but confirm to be sure 
     else: pass 

    def cb1select(self): 
     return self.var1.get() 

#End of class definition. 
#Code: 

root=Tk() 
window=BatchIndiv(root) 
root.mainloop() 

# now do here whatever you want to do with the variable b 
print b 

(グローバル変数を使用することは良いアイデアではありませんが、私はあなたがbで何をしたいのか分からないから、私は何を示唆することはできませんよ。)

+0

ええ、それはまさに私がやったことです。ありがとう。 –

1

一般的に言えば、mainloopへの呼び出し後に決してコードを書くべきではありません。それはGUIプログラムの仕組みではありません。

ユーザーがボタンを押すと、ボタンのコマンドがすべて実行される(または開始される)必要があります。プログラムを終了させたい場合は、ルートウィンドウを破棄して(mainloopメソッドを終了させます)、プログラムが終了します。あなたはメインループの後に物事を走らせるべきではありません。

...そして、そのために、mainloopの後にボタンからコードにデータを渡す方法の問題は疑問になります。

したがって、あなたの例では...の何かを実行するメソッドを作成します。そのメソッドをButtonClickから呼び出すと、そのメソッドを呼び出すと、GUIから任意の情報を渡すことができます。このようなものになり

ButtonClickはその後:

def ButtonClick(self): 
    if self.var1.get()==1: 
     b=BatchImport() 

    elif self.var1.get()==2: 
     b=IndivImport() 

    self.DotDotDot(b) 
    self.master.quit() 
+0

うん、最終的に私はすべてのコードをクラスに入れようとしていますが、今はすべてを確実に行うためにステップバイステップで実行しています。ありがとう:) –

関連する問題