2016-07-10 12 views
0

'変数A'という名前の変数を 'Class_A'クラスから 'App(tk)'という別のクラスにあるリストボックスに挿入しようとしています。誰でも助けてくれますか?別のクラスからTkinterリストボックスに変数を挿入する

結果はIdeal Resultのようになります。

しかし、「実行」ボタンを押した後のコードを使用すると、既存の「ポジティブ」リストボックスに「変数A」を挿入する代わりに、新しいウィンドウ(メインウィンドウと同じ)が開きます窓。 Actual Resultと私はまた、エラーが表示されますはAttributeErrorは:「_tkinter.tkapp」オブジェクトが属性を持っていないここにmyListbox_01 "

はコードです:

from tkinter import * 
import tkinter.messagebox as tkMessageBox 
import tkinter.filedialog as tkFileDialog 


class class_A(object): 
    def __init__(self, isON = False): 
     self.isOn = False 
    def turnOn(self): 
     self.isOn = True 
     tkMessageBox.showinfo(title = 'On', message = 'It is on') 
     x = 'favorable' 
     if x == 'favorable': 
      temp_App = App() 
      temp_App.myListbox_01.insert(END, 'Variable A') 
     else: 
      temp_App.myListbox_02.insert(END, 'Variable A') 

    def turnOff(self): 
     self.isOn = False 
     tkMessageBox.showinfo(title = 'Off', message = 'It is off') 


class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 

     def toggle(): 

      if button.config('text')[-1] == 'Run': 
       A = class_A() 
       A.turnOn() 
       button.config(text='Stop') 
      else: 
       button.config(text='Run') 

       A = class_A() 
       A.turnOff() 


     Frame_0 = Frame(self, bg = 'Black', borderwidth = 2, relief = GROOVE) 
     Frame_0.pack(side = TOP, padx = 10, pady = 2.5) 

     # Positive 
     Frame_title01 = Frame(Frame_0, bg="white", height = 10, width = 300, borderwidth = 2, relief=GROOVE) 
     Frame_title01.grid(row = 0, column = 0, padx=5, pady=5) 
     Label(Frame_title01, text="positive").pack(padx=2, pady=2) 

     Frame_01 = Frame(Frame_0, bg="white", height = 200, width = 300, borderwidth = 2, relief=GROOVE) 
     Frame_01.grid(row = 1, column = 0, padx=5, pady=5) 

     myListbox_01 = Listbox(Frame_01, bg = 'white', width = 15, height = 10, font = ('times', 14), borderwidth=0) 
     myListbox_01.grid(row = 0, column = 0, padx = 80, pady = 5) 

     # Negative 
     Frame_title02 = Frame(Frame_0, bg="white", height = 10, width = 300, borderwidth = 2, relief=GROOVE) 
     Frame_title02.grid(row = 0, column = 1, padx=2, pady=2) 
     Label(Frame_title02, text="Negative").pack(padx=2, pady=2) 

     Frame_02 = Frame(Frame_0, bg="white", height = 200, width = 300, borderwidth = 2, relief=GROOVE) 
     Frame_02.grid(row = 1, column = 1, padx=5, pady=5) 

     myListbox_02 = Listbox(Frame_02, bg = 'white', width = 15, height = 10, font = ('times', 14), borderwidth=0) 
     myListbox_02.grid(row = 0, column = 0, padx = 80, pady = 5) 

     # Button   
     Frame_1 = Frame(self, bg = 'white', borderwidth = 2, relief = FLAT) 
     Frame_1.pack(side = TOP) 

     button = Button(Frame_1, text = 'Run', command = toggle) 
     button.pack(pady = 10) 



if __name__ == "__main__": 
    app = App() 
    app.geometry("800x300+51+51") 
    app.title("GUI") 
    app.mainloop() 
+0

出力の例とそれが機能しない理由を教えてください。それはあなたにエラーを出すのか、正しい出力を出さないのか、それとも何か他のことをしているのでしょうか?あなたは私たちに良いコードサンプルを与えました。いくつかの出力と問題点を提示してください。 – HyperNeutrino

+0

@Alex、サンプル出力と問題を投稿しました。 – Fxs7576

答えて

1

あなたclass_Aインスタンスが作成されますので、あなたが新しいウィンドウを取得しています新しいAppインスタンスがturnOnにあります。おそらく、既存のAppをある地点(コンストラクタまたはturnOn自体)に渡したいと思うでしょう。

ここでは、すばやく汚れた修正があります。より良いバージョンでは、class_Aにインスタンス変数の値を保持するのではなく、turnOnにのみ渡します(ボタンを押すたびに新しいインスタンスを作成するのではなく、class_Aの単一インスタンスを保持することもできます)。 ):

class class_A(object): 
    def __init__(self, isON = False): 
     self.isOn = False 
    def turnOn(self, app):    # new app arg!!! 
     self.isOn = True 
     tkMessageBox.showinfo(title = 'On', message = 'It is on') 
     x = 'favorable' 
     if x == 'favorable': 
      app.myListbox_01.insert(END, 'Variable A') # use new arg here 
     else: 
      app.myListbox_02.insert(END, 'Variable A') # and here 

    def turnOff(self): 
     self.isOn = False 
     tkMessageBox.showinfo(title = 'Off', message = 'It is off') 

class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 

     def toggle(): 

      if button.config('text')[-1] == 'Run': 
       A = class_A() 
       A.turnOn(self)     # pass self as app arg! 
       button.config(text='Stop') 
      else: 
       button.config(text='Run') 

       A = class_A() 
       A.turnOff() 

     # ... 
+0

ありがとうございます。私はあなたのコードを実行しようとするが、それは私にエラーを与えます(AttributeError: '_tkinter.tkapp'オブジェクトには属性 'myListbox_01'がありません)。それでもリストボックスを見つけることができません。 – Fxs7576

+0

ええ、元のコードでも、新しいウィンドウではなく、元のコードでもその問題が発生しているはずです。ウィジェットを 'App .__ init__'のインスタンス変数に割り当てるのではなく、ローカル変数だけに割り当てます。それらをインスタンス変数にするために 'self'の属性(' self.myListbox_01'のようなもの)にそれらを割り当てます。 – Blckknght

+0

それは動作します!ご協力いただきありがとうございます。説明は非常に効果的です。 – Fxs7576

関連する問題