2017-05-02 9 views
0

Die Dokumentation schlägt vor, ich sollte in der Lage sein, ein Frame-Objekt in einem Canvas zu positionieren, und das Frame-Objekt selbst könnte einen Canvas enthalten. Ich frage mich, warum der folgende Spielzeugcode nicht funktioniert. Ich sehe die Zeichenfolge "Hallo" nirgendwo, nur die blaue "Outercanvas". Was mache ich falsch?Python Tkinter Canvas in Canvas

from tkinter import * 
class MainWindow(Frame): 
def __init__(self): 
    super().__init__() 
    self.pack(fill=Y, side = LEFT) 
    inframe = Frame(self) 
    innercanvas = Canvas(inframe, width=20, height=20) 
    innercanvas.create_text(10, 10, anchor=NW, text="Hello") 

    outercanvas = Canvas(self, width=100, height=100, bg='#00ffff') 
    outercanvas.create_window(0, 0, anchor=NW, window=inframe) 
    outercanvas.pack(side=LEFT) 

root = MainWindow() 
root.mainloop() 

Antwort

2

Der primäre Grund, warum Sie nicht innercanvas zu sehen ist, dass Sie (oder eine andere Geometrie-Manager) auf ihn nie .pack() genannt, so die enthält inframe nicht angezeigt werden nicht kennt.

Befestigung, die nicht den Code tatsächlich funktioniert hat, und ich fand das ziemlich überraschend - offenbar, weil Sie inframe zuvor erstellt als outercanvas, wie Kinder im gleichen Rahmen, blieb inframe unterhalb der Leinwand geschichtet und war daher nicht sichtbar . (Dies war mit Python 2.7, vielleicht wurde es in der von Ihnen verwendeten Version behoben.) Das Verschieben der Erstellung von outercanvas um ein paar Zeilen behebt dies; Vielleicht möchten Sie inframe ein Kind von outercanvas statt eines Geschwister machen, um die hierarchische Struktur Ihrer Widgets besser widerzuspiegeln.

Beachten Sie, dass inframe eigentlich gar nicht benötigt - Sie create_window() genutzt haben könnte direkt innercanvas-outercanvas hinzuzufügen.

+0

Was für ein Narr! Ich kann nicht glauben, dass ich das vermisst habe. Danke – user3474688

Verwandte Themen