2016-08-04 21 views
1

Ziel: Ich versuche, eine GUI mit einem Teil des Bildschirms mit "Tabs" zu erstellen (Informationen angezeigt können auf der Registerkarte geändert werden), und ein anderer Teil zeigt ständig das gleiche.Python Tkinter Registerkarten und Canvas

import ttk 
import Tkinter 


def demo(): 
    #root = tk.Tk() 
    schedGraphics = Tkinter 
    root = schedGraphics.Tk() 


    root.title("Testing Bot") 
    universal_height = 606 
    canvas = schedGraphics.Canvas(root,width = 900, height = universal_height) 

    nb = ttk.Notebook(root) 


    # adding Frames as pages for the ttk.Notebook 
    # first page, which would get widgets gridded into it 
    page1 = ttk.Frame(nb,width = 300,height = universal_height) 
    # second page 
    page2 = ttk.Frame(nb,width = 300,height = universal_height) 


    nb.add(page1, text='One') 
    nb.add(page2, text='Two') 

    # 

    nb.grid() 

    day_label = schedGraphics.Label(page1, text="Day1:") 
    day_label.pack() 
    day_label.place(x=0, y=30) 

    day_label = schedGraphics.Label(page2, text="Day2:") 
    day_label.pack() 
    day_label.place(x=0, y=30) 


    canvas.create_rectangle(50,500,300,600,fill = "red") 
    canvas.grid() 



    root.mainloop() 

if __name__ == "__main__": 
    demo() 

Probleme:

  1. In der aktuellen Konfiguration die Lappen in der Mitte des Bildschirms befindet sich nicht auf der linken Seite.

  2. Wenn ich canvas.grid() in canvas.pack() ändere, öffnet es eigentlich kein Fenster?

  3. Das Rechteck auf der Leinwand wird nicht angezeigt!

Vielen Dank.

Antwort

0
  1. Um dies zu tun, wenn Ihr Notebook Rasterung, übergeben das Argument column und 0 wählen, so dass es am äußersten linken befinden wird, wie folgt aus:

    nb.grid(column=0)

  2. Das liegt daran, Sie müssen für Ihre tkinter App zwischen .grid() und .pack() wählen: die beiden sind nicht kompatibel. Wie Sie zuvor .grid() verwendet haben, wird das Fenster nicht geöffnet und ein erscheint.

  3. Ihre Leinwand ist tatsächlich unter dem Notebook versteckt. Um das zu beheben, setzen Sie das row Argument, wenn grid-0 verwenden, so dass es an der Spitze ist, wie folgt aus:

    canvas.grid(column=1, row=0)

Schlusscode:

import Tkinter 
import ttk 


def demo(): 
    #root = tk.Tk() 
    schedGraphics = Tkinter 
    root = schedGraphics.Tk() 

    root.title("Testing Bot") 
    universal_height = 606 

    nb = ttk.Notebook(root) 

    # adding Frames as pages for the ttk.Notebook 
    # first page, which would get widgets gridded into it 
    page1 = ttk.Frame(nb, width= 300,height = universal_height) 
    # second page 
    page2 = ttk.Frame(nb,width = 300,height = universal_height) 

    nb.add(page1, text='One') 
    nb.add(page2, text='Two') 

    nb.grid(column=0) 

    day_label = schedGraphics.Label(page1, text="Day1:") 
    day_label.pack() 
    day_label.place(x=0, y=30) 

    day_label = schedGraphics.Label(page2, text="Day2:") 
    day_label.pack() 
    day_label.place(x=0, y=30) 

    canvas = schedGraphics.Canvas(root, width=900, height=universal_height) 
    canvas.create_rectangle(50, 500, 300, 600, fill="red") 
    canvas.grid(column=1, row=0) 

    root.mainloop() 

if __name__ == "__main__": 
    demo() 

Ich hoffe, das hilft!

+0

Punkt # 1 ist irreführend. Zum einen sagen Sie, dass Sie Spalte 0 verwenden sollen, aber dass Sie Spalte 1 verwenden. Zweitens, nur weil es in der Spalte ganz links steht, wird nicht garantiert, dass es gegen den linken Rand des Fensters ist. –

+0

@BryanOakley Entschuldigung für diesen Tippfehler, danke für den Hinweis. Für den zweiten Punkt, weit links, meine ich, dass nichts zwischen dem Notizbuch und der Kante sein wird, aber nicht unbedingt, dass es daran haften würde. – TrakJohnson

+0

Danke @TrakJohnson! perfekte Antwort und macht genau das, was ich wollte. Folgefrage: Angenommen, ich möchte ein Rechteck auf der Registerkarte zeichnen (und eines, das ich auf die Leinwand ziehen könnte). Ich habe bereits den Drag-Code auf der Leinwand, aber ich kann keine Rechtecke auf der "Registerkarte" – smarttylerthecreator