2017-02-11 14 views
0

Python 2.11を使用してTkinterでGUIを作成し、OOPアプローチを使用して継承を学習しようとしています。下のGUIには、2つのエントリウィジェットがあります。 "Enter Value - Not Return"というラベルの付いた最初のウィジェットは、Tkinter Entry Classから継承するEntryFieldクラスを使用します。この入力ボックスに値を入力すると、setDesVolメソッドが呼び出されますが、self.desVの値は返されません。他のステートメントを試してみると、self.desV = self.parent.get()(コメントアウトされています)では、MainWindowインスタンスにはget属性がないというエラーが返されます。Tkinterでエントリーボックスウィジェットを継承する際の問題

オブジェクトentValueに割り当てられた次のエントリウィジェットを呼び出すと、これはMainWindowクラスに含まれており、メソッドsetValueとself.entValue.get()が意図したとおりに機能するため完全に正常に機能します。

エントリーボックスから値を取得するためにEntryFieldクラスで間違っていることを知っている人はいませんか?私の計画は最終的なGUIに多くの入力ボックスを持ち、各エントリーボックスにsetDesVolなどの独自の関連メソッドを持たせて、コードをよりきれいにして管理しやすくすることです。私はこれを理解しようと約3日を費やしているので、どんな助けにも感謝しています。コードは以下に添付されています。おかげEntryFieldクラスで

import Tkinter as tk 
import ttk 
import tkMessageBox as mBox 

class MainWindow(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 

     self.olFrame = tk.LabelFrame(text = 'Open Loop Frame', bg = 'red') 
     self.olFrame.grid(column = 0, row = 0, sticky = 'w') 
     self.voltLabel = tk.Label(self.olFrame, 
       text = 'Enter Value - Does Not Return ', 
       font = ("Times", 10), bg = 'red').grid(column = 0, row = 1) 

     #entry box code that does not return anything 
     self.entDesVolt = EntryField(self.olFrame,bg = 'red') 
     self.entDesVolt.bind("<Return>", EntryField(self).setDesVol) 
     self.entDesVolt.grid(column = 1, row = 1) 

     #this entry box code works fine 
     self.mezLabel = tk.Label(self.olFrame, 
       text = 'Enter Another Value - works right ', 
       font = ("Times", 10), bg = 'grey').grid(column = 0, row = 2) 
     self.entValue = tk.Entry(self.olFrame, bg = 'grey') 
     self.entValue.bind("<Return>", self.setValue) 
     self.entValue.grid(column = 1, row = 2) 

    def setValue(self, event): 
     print self.entValue.get() 
     print 10 + float(self.entValue.get()) 

class EntryField(tk.Entry): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Entry.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     print "self.parent in EntryField is type: ", type(self.parent) 

    def setDesVol(self,event): 
     self.desV = EntryField(self).get() #doesnt return anything in print statement 
     #self.desV = self.parent.get() #MainWindow instance has no attribute get 
     #self.desV = tk.Entry(self).get() #doesnt return anything in print statement 
     print "self des V is: ", self.desV 

root = tk.Tk() 
root.geometry('500x400') 
root.title('Test GUI') 
root.configure(background = "black") 

a = MainWindow(root) 
root.mainloop() 

答えて

1

は、setDesVol方法では、あなたが使用します。

`self.desV = EntryField(self).get()` 

ですから、新しいEntryFieldインスタンスを作成し、エントリはデフォルトでは空であるため、''を返すそのgetメソッドを呼び出します。

self.entDesVolt = EntryField(self.olFrame, bg='red') 
self.entDesVolt.bind("<Return>", EntryField(self).setDesVol) 
:あなたはバインディングを行うときは、 MainWindowクラスで同様の問題を抱えている

`self.desV = self.get()` 

:現在EntryFieldのコンテンツを取得するには、ちょうどそれがtk.Entry `から継承されたgetメソッドを呼び出します

2行目はEntryFieldを作成し、そのsetDesVolメソッドをReturnキーのプレスにself.entDesVoltでバインドします。この新しいEntryFieldは空であるため、Returnキーを押すと「self des V is:」と表示されます。これを修正するには、self.entDesVoltsetDesVolメソッドをReturnキープレスに直接バインドするだけです。

self.entDesVolt = EntryField(self.olFrame, bg='red') 
self.entDesVolt.bind("<Return>", self.entDesVolt.setDesVol)