2016-04-11 33 views
0

まず、オブジェクト指向の構造全体が非常に新しいです。しかし、基本的には、私はTkinterを使っていたので、このバグを理解できないようです。Python Tkinterオブジェクト指向コーディングの問題

基本的には、サイドバーやメインボードなど、さまざまな部品でGUIを作ろうとしています。そこでサイドバーとメインボードを2つのクラスに分けたいと思っていました。しかし何らかの理由で、それはちょうど働いていません。あなたがボタンを押したときに、それはきれいなテキストをワイプしてから、新しい何かを出力するようしたがって、基本的

class SideBar(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     sidebarframe = tk.Frame(root) 
     sometext = tk.Text(sidebarframe,...) 
     button= tk.Button(sidebarframe, ... , command = self.do_something) 

     sidebarframe.grid(row = 0, column = 0) 
     sometext.grid(row = 0, column = 1) 
     button.grid(row = 0, column = 2) 


    def do_something(self): 
     self.sometext.delete(1.0, END) 
     ... 

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

     self.SideBar.pack(side="bottom", fill="x") 


if __name__ == "__main__": 
    root = tk.Tk() 
    MainApplication(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 

は、私がそれをしたいが、私はそれを実行するたびに、それは、サイドバーのインスタンスが「sometextのない属性を持っていないと述べています"

私はこれ以上狂っているように感じる。私は何かが欠けていることを知っている...しかし、私は何が分からない。

また、私はTkinterのオブジェクト指向構造の完全な初心者ですから、いくつかの魂がサンプルコードにリンクすることができますので、私はそれを勉強することができますか?十分なチュートリアルはありましたが、サンプルコードが不足しています。どうもありがとうございます。

+0

は同じページのサイドバーとメインボードです – ryanmoir

+0

同じページで同じウィンドウを意味しますか?はい、私はそうであることを計画しています。 –

+0

サイドバーとメインボードが同じクラスになるように、ウィンドウごとに1つのクラスがあります。次に、GUIの別々のセクションがある場合、フレームを使用します。私はマンチェスターに現在のようにいくつかのコードで回答を投稿します – ryanmoir

答えて

1

不要で一見混乱しない継承を削除し、sometextをインスタンスオブジェクトにすることは、期待通りに機能します。オブジェクト指向プログラミングは、1つの問題を解決する/ 1つの問題を解決するオブジェクトの周りを回転することに注意してください。継承はオブジェクト指向と同じではありません。

try: 
    import Tkinter as tk  ## Python 2.x 
except ImportError: 
    import tkinter as tk  ## Python 3.x 

class SideBar(): 
    def __init__(self, root): 
     sidebarframe = tk.Frame(root) 
     self.sometext = tk.Text(sidebarframe) 
     button= tk.Button(sidebarframe, text="do something", 
          command = self.do_something) 

     sidebarframe.grid(row = 0, column = 0) 
     self.sometext.grid(row = 0, column = 1) 
     button.grid(row = 0, column = 2) 

     self.sometext.focus_set() 

    def do_something(self): 
     self.sometext.delete(1.0, "end") 
     print "do something" 

class MainApplication(): 
    def __init__(self, parent): 
     self.parent = parent 
     self.SB = SideBar(self.parent) 


if __name__ == "__main__": 
    root = tk.Tk() 
    MainApplication(root) 
    root.mainloop() 
+0

これははるかに簡単に見え、それはうまく動作します。しかし、私はフォローアップの質問がありました。 "sometext"テキストボックスはサイドバーフレームにあるので、self.sometextという名前を付ける必要がありますが、サイドフレーム内にsecondframeという別のフレームがあり、そこにテキストボックスを配置したいと思います。 ? self.secondframe.secondtext = tk.Text(...)? –

+0

self.sometextは、SideBarクラスのインスタンスオブジェクトです(whew)。短いバージョンは、SideBarクラスのどこにでも見ることができるということです。フレーム#2でいくつかのテストコードを試してください。インスタンスオブジェクトであるため、インスタンスを認識しているオブジェクトでインスタンスを使用してアクセスすることもできます。したがって、MainApplicationではself.SB.sometextを出力します。 Tkinter IDは、SideBarに印刷されるのと同じIDになります。 MainApplicationからテキストを削除することもできますが、クラスの目的はクラス内のすべてを処理することです。 –

+0

したがって、2番目はself.sometext_2 = tk.Text(sidebarframe_2)です。フレームはテキストの定義を持ち、オブジェクトを指す変数、つまりself.sometext_2とは何の関係もありません –

関連する問題