button.place() funktioniert nicht ganz

Fragen zu Tkinter.
Antworten
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
TomPy
User
Beiträge: 5
Registriert: Freitag 4. Mai 2012, 17:30

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
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
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.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
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.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Ist dann folgende Aufstellung in Python überhaupt möglich, ohne place()?
Bild
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
BlackJack

@StefanLawl: Ja. Wüsste nicht was dagegen spricht.
TomPy
User
Beiträge: 5
Registriert: Freitag 4. Mai 2012, 17:30

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
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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:
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
Antworten