2016-12-09 6 views
-1

GUIスライダの番号に別の数の別のGUIスライダを掛けたクラスの非常に簡単なプログラムを作っています。しかし、何らかの理由で今プログラムを実行すると、 'gui'オブジェクトに 'slider1'という属性がないというAttributeErrorが表示されます。何か案は?コードは次のとおりです。Python、Tkinterライブラリ、GUIに関連するオブジェクトの属性エラー

import tkinter 
import random 

class gui: 
    def __init__(self): 
     self.main_window = tkinter.Tk() 

     #widgets 
     self.__canvas = tkinter.Canvas(self.main_window,bg='white',width=300,height=10) 

     self.label = tkinter.Label(self.main_window,text=('Product:',0)) 
     self.slider1 = tkinter.Scale(self.main_window,from_=0, to=12) 
     self.slider2 = tkinter.Scale(self.main_window,from_=0, to=12) 

     #packs 
     self.__canvas.pack() 

     self.label.pack(side='top') 
     self.slider1.pack(side='left') 
     self.slider2.pack(side='right') 
     self.button = tkinter.Button(self.main_window,text='Click to multiply',command=self.multiply()) 
     self.button.pack(side='bottom') 

     tkinter.mainloop() 

    def multiply(self): 
     x = int(self.slider1.get()) 
     y = int(self.slider2.get()) 
     num = x*y 
     self.label.config(text=('Product:',num)) 

gui() 
+0

私はあなたの質問を編集し、今すぐに動作します! @Parker – dsgdfg

+0

存在しない要素は処理できません。変更/アクセスの前に作成してください。 – dsgdfg

答えて

0

プログラムに構文エラーがいくつかあります。同様に、あなたはスケールに方向を置くべきです。ここにコードがあります。

import tkinter as tk 

class gui: 
    def __init__(self): 
    self.root = tk.Tk() 

    # the widgets 
    self.button = tk.Button(self.root, text="Multiply!", command=self.multiply) 
    # you need no '()' for the function when inputing it in tkinter. 
    self.label = tk.Label(self.root, text="Product: 0") # the '0 must be a string 
    self.sliderX = tk.Scale(self.root, from_=0, to=12, orient=tk.HORIZONTAL) 
    self.sliderY = tk.Scale(self.root, from_=0, to=12, orient=tk.VERTICAL) 
    # add an orient to the scales. 

    # now pack the widgets. 
    self.button.pack() 
    self.label.pack() 
    self.sliderX.pack() 
    self.sliderY.pack() 

    def multiply(self): 
    x = int(self.sliderX.get()) 
    y = int(self.sliderY.get()) 
    num = str(x * y) # need to turn the int to a string. 
    self.label.config(text="Product: "+num) 

app = gui() 
app.root.mainloop() 

理由は、それがあなたのために働いていない理由は、プログラムのインスタンスがないためです。これは私が最後にやっていることです。 Pythonのガベージコレクションでは、gui()で作成されたインスタンスが収集されるため、Tkinterはクラスのインスタンスを参照できません。

+0

ありがとう、プレストン、あなたは私の問題を解決しました。あなたのコーディングスタイルが好きです。私よりもはるかにシンプルで綺麗です。最初のコード行はtkinterをtkとして参照するのを簡単にしますか? – Parker

+0

はい、モジュールをインポートしますが、別の名前でインポートします。コンパイラは後でそれを変更しますが、それについては心配する必要はありません。 –

+0

素晴らしい、知っておいてよかった。再度、感謝します! – Parker

関連する問題