Objekte aus Canvas überlappen

Fragen zu Tkinter.
Antworten
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

Hi!

Ich hab mich angemeldet, weil ich ein Problem hab, zu dem ich irgendwie im Web nicht wirklich was brauchbares finde. Ähm, ich hab nicht wirklich viel Ahnung von Python - also bitte Nachsicht walten lassen ;)

Ich bin dabei für die Schule ein recht umfangreiches Programm zu schreiben, und bastel grad an der Benutzeroberfläche. Dabei habe ich alle Widgets als Objekte auf eine große Canvas gelegt (mit .create_window), hat verschiedene Gründe. Klappt auch soweit ganz gut :) .

Nun hab ich zwei Objekte (ein Textfeld und ein Button) die sich überlappen. Ich erstelle den Button erst nach dem Textfeld, deshalb ist er drüber. Ich möchte aber gerne, dass das Textfeld über dem Button ist. (In anderer Reihenfolge erstellen geht nicht.)

Ich hab schon im Internet gesucht, und hab auch ne Möglichkeit gefunden, was aber nicht so richtig zu funktionieren scheint - aber ich weiß auch nicht, ob ich wirklich verstanden hab, worum es da geht, und was ich genau schreiben muss.

Hier im Forum gibt es ja einen ähnlichen Thread zum überlappen von Widgets (hab mit der Suche und auch so beim stöbern nur den einen zu dem Bankautomaten-Dings gefunden), aber daraus werd ich nicht schlau - ich seh da irgendwie keinen unterschied zwischen vorher und nachher, und das scheint auch irgendwie ein anderes Problem zu sein :K

Ich hab mal den problematischen Teil des Quelltexte in ein kleines Programm gepackt, bei dem es nur zwei sich überlappende Buttons auf ner Canvas gibt, weil das ganze Programm ein bisschen kompliziert ist (und mein Programmierstil wahrscheinlich auch nicht so doll^^).

Code: Alles auswählen

from Tkinter import *

def cb1():
    print "=)"
def cb2():
    print "=("

master=Tk()

c=Canvas(master,width=500,height=500,bg="yellow")
c.pack()

hoehe=200
weite=200

b1=Button(master,height=hoehe,width=weite,text="1",command=cb1)
b1c=c.create_window(200,200,height=hoehe,width=weite,window=b1)

b2=Button(master,height=hoehe,width=weite,text="2",command=cb2)
b2c=c.create_window(300,300,height=hoehe,width=weite,window=b2)

# Ich habe zwei Buttons auf dieser Canvas erstellt, die sich überlappen.
# Der zweite ist über dem ersten (da ich den ersten vor dem zweiten erstellt hab)
# Ich möchte aber einen Befehl finden, mit dem ich b1 über b2 heben kann.

# In einer Quelle hab ich folgendes gefunden:

# ".tag_raise ( tagOrId, aboveThis )
# Moves the object or objects selected by tagOrId within the display list to
# a position just above the first or only object specied by the tag or ID
# aboveThis."

# Wenn ich schreibe "c.tag_raise(" gibt Python mir folgendes:
# "Raise an item TAGORID given in ARGS"

# So richtig weiß ich nicht, was genau gemeint ist.
# Hab die Quelle folgenderweise interpretiert:

# c.tag_raise(b1c,b2c)

# Das klappt aber nicht - keine Fehlermeldung, einfach nix.
# Ich hab dann probiert statt b2c eine Zahl oder was anderes zu schreiben, da
# passiert aber immer einfach gar nichts.

master.mainloop()
Die ganze Erklärung ist ja auskommentiert schon drin - ich hatte das schonmal einem Freund von mir geschickt, aber der konnte auch nicht helfen. (Übrigens, ich hab da oben aus der Liste "python" genommen, wusste aber nicht, ob nicht villeicht auch "Code" richtig ist? Also, um den Code hier in dem Post einzufügen...)

Ach so, ich benutze Python 2.6.

Wisst ihr, wie ich das machen kann?
Danke schonmal im voraus. :D

LG, Lou
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

laura_lou hat geschrieben:

Code: Alles auswählen

b1=Button(master,height=hoehe,width=weite,text="1",command=cb1)
b1c=c.create_window(200,200,height=hoehe,width=weite,window=b1)

b2=Button(master,height=hoehe,width=weite,text="2",command=cb2)
b2c=c.create_window(300,300,height=hoehe,width=weite,window=b2)
Erstmal: "tag_raise(item) - This method doesn’t work with window items. To change their order, use lift on the widget instance instead."

Also mach es so:

Code: Alles auswählen

from Tkinter import *

def cb1():
    b1.lift()
def cb2():
    b2.lift()
    
master=Tk()

c=Canvas(master,width=500,height=500,bg="yellow")
c.pack()

hoehe=200
weite=200

b1 = Button(height=hoehe, width=weite, text="1", command=cb1)
b1c = c.create_window(200, 200, height=hoehe, width=weite, window=b1)

b2 = Button(height=hoehe, width=weite, text="2", command=cb2)
b2c = c.create_window(300, 300, height=hoehe, width=weite, window=b2)

root.mainloop()
Zweitens brauchst du dafür eigentlich kein Canvas, für überlappen kannst du auch einfach .place(x=..., y=...) nutzen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

Hey, danke sehr! :D

Jo, die Canvas ist auch nur, weil das im eigentlichen Programm auch so ist ;)
Also, danke nachmal.

LG
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

laura_lou hat geschrieben:Jo, die Canvas ist auch nur, weil das im eigentlichen Programm auch so ist ;)
Habe ich mir schon gedacht, trotzdem könnte man place statt create_window nutzen, aber das ist warscheinlich geschmackssache.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten