Seite 1 von 1
button.place() funktioniert nicht ganz
Verfasst: Samstag 13. Oktober 2012, 19:21
von StefanLawl
Hallo, ich habe ein Problem, dass .place() innerhalb einer class nicht funktioniert.
Beispiel1 funktioniert:
Code: Alles auswählen
from Tkinter import *
root = Tk()
def spawn_give():
print "give "
button_spawn = Button(root, text="Spawn (give)", command=spawn_give)
button_spawn.place(x=50, y=50)
root.geometry("1080x720")
root.mainloop()
Beispiel2 funktioniert nicht:
Code: Alles auswählen
from Tkinter import *
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.button_spawn = Button(frame, text="Spawn (give)", command=self.spawn_give)
self.button_spawn.place(x=50, y=50)
def spawn_give(self):
print "give "
root = Tk()
overall=App(root)
root.geometry("1080x720")
root.mainloop()
Der Button wird einfach nicht angezeigt, hat jemand eine Idee, weshalb das sein könnte?
Stefan
Re: button.place() funktioniert nicht ganz
Verfasst: Samstag 13. Oktober 2012, 20:20
von TomPy
Hallo StefanLawl,
Ich habe ein Beispiel für dich geschrieben. Ich weiß nicht genau wo der Fehler liegt. Doch ich habe nur dem Frame Höhe und Breite hinzugefügt.
Code: Alles auswählen
from Tkinter import *
class App():
def __init__(self):
self.root = Tk()
self.root.title('Spawn (give)')
#self.root.geometry('1080x720')
self.frame = Frame(self.root, width=1080, height=720)
self.frame.pack()
self.button_spawn = Button(self.frame,
text="Spawn (give)",
command=self.spawn_give)
self.button_spawn.place(x=50, y=50)
def spawn_give(self):
print "give "
def run(self):
self.root.mainloop()
app = App()
app.run()
Dies ist dein Code
Code: Alles auswählen
from Tkinter import *
class App:
def __init__(self, master):
frame = Frame(master, width=1080, height=720)
frame.pack()
self.button_spawn = Button(frame, text="Spawn (give)", command=self.spawn_give)
self.button_spawn.place(x=50, y=50)
def spawn_give(self):
print "give "
root = Tk()
overall=App(root)
root.geometry("1080x720")
root.mainloop()
Gruss TomPy
Re: button.place() funktioniert nicht ganz
Verfasst: Samstag 13. Oktober 2012, 20:26
von StefanLawl
Hallo, danke für den Code, mit dem werde ich wohl weiterarbeiten müssen
TomPy hat geschrieben:Ich weiß nicht genau wo der Fehler liegt.
Das bleibt wohl ein Mysterium :/
Stefan
Re: button.place() funktioniert nicht ganz
Verfasst: Samstag 13. Oktober 2012, 20:40
von BlackJack
@StefanLawl: Das Mysterium ist dass man `place()` nicht verwenden sollte. Das ist einfach kein vernünftiger Layoutmanager. Der `Frame` denkt trotzdem er sei leer und stellt sich so „gross” dar, wie es für einen leeren `Frame` nötig ist.
Re: button.place() funktioniert nicht ganz
Verfasst: Samstag 13. Oktober 2012, 22:08
von StefanLawl
BlackJack hat geschrieben:@StefanLawl: Das Mysterium ist dass man `place()` nicht verwenden sollte. Das ist einfach kein vernünftiger Layoutmanager. Der `Frame` denkt trotzdem er sei leer und stellt sich so „gross” dar, wie es für einen leeren `Frame` nötig ist.
Es ist aber so schön (und) einfach. Gibt es Alternativen?
Stefan
Re: button.place() funktioniert nicht ganz
Verfasst: Samstag 13. Oktober 2012, 22:36
von BlackJack
@StefanLawl: `place()` ist weder schön noch einfach. Man kann damit keine portablen GUIs erstellen, und mit portabel ist hier nicht einmal nur andere Betriebssysteme gemeint, sondern auch das selbe mit einem anderen Monitor oder einer anderen Bildschirmauflösung. Und was das einfach angeht: Schreib mal eine GUI mit mehr als ein paar absolut platzierten Widgets und füge dann irgendwo noch eines ein was es erforderlich macht die meisten von den anderen zu verschieben. Viel Spass dabei.
Insofern gibt es keine Alternativen — die anderen Layoutmanager `grid()` und `place()` funktionieren in solchen Situationen nämlich tatsächlich schön und einfach.
Absolute Positionierung funktionierte bis zu einem gewissen Grad als man nur für eine Plattform programmiert hat, und dort auch alle in Frage kommenden Displays die gleiche physikalische Auflösung hatten. Entweder weil das tatsächlich der Fall war, oder weil das Fenstersystem einfach von einer festen physikalischen Auflösung ausgegangen ist, egal ob das nun stimmte oder nicht. Das macht aber selbst Windows heute nicht mehr. Auch Microsoft setzt auf Layoutmanager, die den tatsächlichen Platzbedarf dynamisch berücksichtigen.
Re: button.place() funktioniert nicht ganz
Verfasst: Sonntag 14. Oktober 2012, 15:46
von StefanLawl
Ist dann folgende Aufstellung in Python überhaupt möglich, ohne place()?

Re: button.place() funktioniert nicht ganz
Verfasst: Sonntag 14. Oktober 2012, 16:49
von BlackJack
@StefanLawl: Ja. Wüsste nicht was dagegen spricht.
Re: button.place() funktioniert nicht ganz
Verfasst: Sonntag 14. Oktober 2012, 17:24
von TomPy
Hallo StefanLawl
Probier das doch mal mit Frames darzustellen.
Code: Alles auswählen
import tkinter
app=tkinter.Tk()
app.geometry("1000x700")
app.title("Frames")
# Frames
middle_container = tkinter.Frame(app)
middle_container.pack(fill='both', expand='True')
fr_Links_container=tkinter.Frame(middle_container, width=500, bg="blue")
fr_Links_container.pack(side="left", fill='y')
fr_Oben=tkinter.Frame(fr_Links_container, height=25, bg='red')
fr_Oben.pack(fill='x', anchor='n')
fr_mitteLinks=tkinter.Frame(fr_Links_container, width=600, bg="yellow")
fr_mitteLinks.pack(side="left", fill='y')
fr_mitteRechts=tkinter.Frame(fr_Links_container, width=200, bg="skyblue")
fr_mitteRechts.pack(side="right", fill='y')
fr_Rechts=tkinter.Frame(middle_container, width=200, bg="green")
fr_Rechts.pack(side="left", fill='both', expand=True)
app.mainloop()
Gruß TomPy
Re: button.place() funktioniert nicht ganz
Verfasst: Sonntag 14. Oktober 2012, 19:28
von StefanLawl
Hey, danke TomPy, ich werd's probieren
BlackJack hat geschrieben:@StefanLawl: Ja. Wüsste nicht was dagegen spricht.
Mh, dann werde ich wohl herausfinden müssen wie
Edit: Danke Tompy! Genau das habe ich gesucht

Auch danke an BlackJack für die Tipps
