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 :D
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()?
Bild

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 :D

Edit: Danke Tompy! Genau das habe ich gesucht :) Auch danke an BlackJack für die Tipps :mrgreen: