2017-08-24 15 views
0

それぞれのタブは自分のクラスから来るようにしたい(クラスは独自のファイルにあります - 私は今のところ最初のものをテストしています)。tkinterにノートブックタブを追加する - クラスベースの構造ではどうしたらいいですか? (Python 2)

ここ

は、私が試したものです:

tab1.py

from Tkinter import * 
import Tkinter as tk 

class Tab(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self, master) 
     fr = Frame(self).pack() 
     Label(fr, text="one", bg='red', bd=2).pack() 
     Label(fr, text="two", bg='yellow', bd=2).pack() 

if __name__ == '__main__': 
    root = Tk() 
    frame = Frame(root).pack() 
    Tab(frame) 
    Button(frame, text='only if class', command=root.destroy).pack() 
    mainloop() 

noteBook.py

from Tkinter import * 
from ttk import * 
from tab1 import Tab 

root = Tk() 
note = Notebook(root) 

main_frame = Frame(note) 
button1 = Button(main_frame, text='test').pack() 

#tab1 = Tab(note) 
tab1 = Frame(note) 
tab2 = Frame(note) 
tab3 = Frame(note) 
Tab(tab1) 
Button(tab1, text='Exit', command=root.destroy).pack() 

note.add(tab1, text = "Tab One", compound=TOP) 
note.add(tab2, text = "Tab Two") 
note.add(tab3, text = "Tab Three") 
note.pack() 
root.mainloop() 
exit() 

実行して:

python2.7 noteBook.py

問題は、tab1.pyの内容が最初のタブに表示されず、ノートブック全体を含むフレーム内に表示されることです。

また、python2.7 noteBook.pyで直接tab1.pyを実行しているときは、今のところ正しく表示されるようにするには、if __name___ ...の部分の余分なボタンを表示する必要があります。

複数の例がありますが、必要なものが1つしか見つかりませんでしたが、実際の解決策はなく、python3のためのものでした。私はpython2を好きです。ありがとう。あなたは上記を行うと

fr = Frame(self).pack() 

frNoneNone戻り.pack()ので(x().y()y()の値を返すため)を次のとおりです。

答えて

1

問題は、このコード行です。その後、あなたは次の操作を行います。fr以来

Label(fr, text="one", bg='red', bd=2).pack() 

は、ラベルがルートウィンドウに作成され、Noneです。

問題とは無関係に、いくつかのアドバイスがあります:あなたはあまりにも多くのフレームを作成しています。

class Tab(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self, master, background="pink") 
     Label(self, text="one", bg='red', bd=2).pack() 
     Label(self, text="two", bg='yellow', bd=2).pack() 

ノートブックに追加するには、あなただけの必要があります。ここでは、Tabのために必要なすべてですあなたはTabの内部frを必要としない、とあなたはtab1tab2、またはtab3

を必要としません。二行:

tab1 = Tab(note) 
note.add(tab1, text = "Tab One", compound=TOP) 
+0

それは 'python2.7 noteBook.py'を実行したとき、それはノートブックの中に行くべきタブを挿入するに成功したが、それは' python2.7のtab1.py'壊す:私は、ファイルを実行し、 'TAB1を.py'を直接実行すると、タブが正しく表示されず、 'Tab'クラス内の2つのラベルが表示されません。 – Touten

+0

HIブライアン、私はTkinterのあなたの他のポストのいくつかをチェックして、多くのことをより明確にしました。ありがとう。 – Touten

0

これは完璧に動作し、楽しみのためだけに、私はちょうど簡単にするため、同じクラスを再利用したタブ2と3 althoughtの移入を示してきました ここに。目標は、毎回全部を実行することなく、タブを直接実行して開発中にタブを単独で表示できるようにすることでした。

noteBook.py

from Tkinter import * 
from ttk import * 
from tab1 import Tab 

root = Tk() 
note = Notebook(root) 

main_frame = Frame(note) 
button1 = Button(main_frame, text='test').pack() 

tab1 = Frame(note) 
tab2 = Frame(note) 
tab3 = Frame(note) 
Tab(tab1) 
Tab(tab2) 
Tab(tab3) 
Button(tab1, text='Exit', command=root.destroy).pack() 

note.add(tab1, text = "Tab One", compound=TOP) 
note.add(tab2, text = "Tab Two") 
note.add(tab3, text = "Tab Three") 
note.pack() 
root.mainloop() 
exit() 

TAB1。PY

import Tkinter as tk 

class Tab(tk.Frame): 
    def __init__(self, parent_widget): 
     tk.Frame.__init__(self, parent_widget) 
     self.fr = tk.Frame(parent_widget, width=200, height=200, bg='pink', bd=2) 
     tk.Label(self.fr, text="one", bg='red', bd=2).pack() 
     tk.Label(self.fr, text="two", bg='yellow', bd=2).pack() 
     self.fr.pack() # this packing must be done after 2 above packings 

if __name__ == '__main__': 
    root = tk.Tk() # the app window 
    main_frame = tk.Frame(root, height=200, width=200, bg='blue', bd=2) # main frame 
    Tab(main_frame) # instatiate Tab(), sending main_frame as the parent_widget 
    tk.Button(main_frame, text='only if class', command=root.destroy).pack() 
    main_frame.pack() # display main frame on window 
    tk.mainloop() 
関連する問題