2017-06-25 10 views
0

この例のように2つのフレームにウィジェットを表示したtkinterアプリケーションを作成しました。このアプリケーションは正常に動作します。tkinterにノートブックタブを追加する - クラスベースの構造を使ってノートブックタブを作成するにはどうすればいいですか? (Python 3)

from tkinter import * 
from tkinter import ttk 

root = Tk() 
root.title("Example") 

notebook = ttk.Notebook(root) 
frame1 = ttk.Frame(notebook) 
frame2 = ttk.Frame(notebook) 
notebook.add(frame1, text="Frame One") 
notebook.add(frame2, text="Frame Two") 
notebook.pack() 

#(The labels are examples, but the rest of the code is identical in structure). 

labelA = ttk.Label(frame1, text = "This is on Frame One") 
labelA.grid(column=1, row=1) 

labelB = ttk.Label(frame2, text = "This is on Frame Two") 
labelB.grid(column=1, row=1) 

root.mainloop() 

私はクラスを使用するようにプログラムを再構成しようとすることに決めました(これはあまりよく知られていません)。しかし、ウィジェットが別のフレームに表示されるようにするにはどうすればよいか分かりません(他のすべては問題ありません)。たとえば、次の例では "TypeError:init()は1から2の位置引数をとりますが、3つは与えられます。"だからおそらく私は余分な引数で初期化する必要があるだろうが、私はノートブックがそれにどのように取り組まれているのか、それが私が取るべきアプローチでさえあるのか分からない。 ( "frame1"と "frame2"引数がラベルから削除された場合、プログラムは実行されますが、両方のフレームに同じものが表示されます)。

from tkinter import * 
from tkinter import ttk 

class MainApplication(ttk.Frame): 
    def __init__(self, parent): 
     ttk.Frame.__init__(self, parent) 

     self.labelA = ttk.Label(self, frame1, text = "This is on Frame One") 
     self.labelA.grid(column=1, row=1) 

     self.labelB = ttk.Label(self, frame2, text = "This is on Frame Two") 
     self.labelB.grid(column=1, row=1) 

root = Tk() 
root.title("Example") 
notebook = ttk.Notebook(root) 
frame1 = ttk.Frame(notebook) 
frame2 = ttk.Frame(notebook) 
notebook.add(frame1, text="Frame One") 
notebook.add(frame2, text="Frame Two") 
notebook.pack() 
MainApplication(root).pack() 
root.mainloop() 

私は解決策に興味があるんだけど、私はまた、クラスは、スタンドアロンのウィジェットに比べ、異なるやっていることを学ぶことに興味があります。

+0

[mcve]を入力してください。コンテキスト外のコードブロックを表示することはあまり役に立ちません。 –

+0

@Bryan Oakleyは –

+0

を改造しました。私はちょうどあなたが探しているものを正確に記述していると思うyoutubeビデオを見ました。ここにシリーズ[リンク](https://www.youtube.com/watch?v=HjNHATw6XgY&list=PLQVvaaQuDclKx-QpC9wntnURXVJqLyk)へのリンクがあります。私はそれが最初のカップルビデオでカバーされていると思います。この男は本質的にあなたの複数のウィンドウのための複数のタブを作成するクラスを作成します。 – Joe

答えて

0

ノートブック内のさまざまなフレームを別々のファイルに分割することをお勧めします。 ファイル/クラスのプレフィックスを追加せずに名前空間に残したかったので、tab2 import *から使用しました。私は書きたくありませんでした:tab1.Tab1(ノートブック)

main.py

import tkinter as tk 
from tkinter import ttk 

from tab1 import * 
from tab2 import *  

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

    notebook = ttk.Notebook(parent) 

    Tab1frame = Tab1(notebook) 
    Tab2frame = Tab2(notebook) 

    notebook.add(Typ1frame, text='TAB1') 
    notebook.add(Typ2frame, text='TAB2') 
    notebook.pack() 

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

tab1.py

import tkinter as tk 
from tkinter import ttk 

class Typ14(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
    tk.Frame.__init__(self, parent, *args, **kwargs) 
    shell_frame=tk.LabelFrame(self, text="Sample Label Frame", padx=5,pady=5) 
    shell_frame.grid(row=0,column=0,padx=5,pady=5) 
0

これは、クラスなどのアプリケーションを一般化する一つの方法だろう。あなたは繰り返しコードを削除したい。

from tkinter import * 
from tkinter import ttk 

class Notebook: 

    def __init__(self,title): 
     self.root = Tk() 
     self.root.title(title) 
     self.notebook = ttk.Notebook(self.root) 

    def add_tab(self,title,text): 
     frame = ttk.Frame(self.notebook) 
     self.notebook.add(frame,text=title) 
     label = ttk.Label(frame,text=text) 
     label.grid(column=1,row=1) 
     self.notebook.pack() 

    def run(self): 
     self.root.mainloop() 

nb = Notebook('Example') 
nb.add_tab('Frame One','This is on Frame One') 
nb.add_tab('Frame Two','This is on Frame Two') 
nb.run() 
関連する問題