wake-up-neo.com

Festlegen eines konstanten Tkinter-Fensters

Ich programmiere ein kleines Spiel mit Tkinter und kurz stecke ich fest.

Ich habe ein Art od Startmenü, in dem sich zwei Schaltflächen und eine Beschriftung befinden.

Wenn ich nur den Rahmen erstelle, ist alles in Ordnung, er hat die Größe 500x500 Pixel

Ich möchte, dass sich der Hintergrund nicht ändert, wenn ich die Knöpfe und die Labe erstelle, aber er passt die Größe an, was ich auch tue. Hier ist mein Code:

import tkinter as tk

def startgame():
    pass

mw = tk.Tk()              #Here I tried (1)
mw.title('The game')

back = tk.Frame(master=mw, width=500, height=500, bg='black')
back.pack()

go = tk.Button(master=back, text='Start Game', bg='black', fg='red',
                     command=lambda:startgame()).pack()
close = tk.Button(master=back, text='Quit', bg='black', fg='red',
                     command=lambda:quit()).pack()
info = tk.Label(master=back, text='Made by me!', bg='red',
                         fg='black').pack()

mw.mainloop()

Ich habe in stackoverflow herumgesucht und nichts Nützliches erhalten! Ich habe nur eine Frage gefunden, die meiner ähnelt, aber die Antwort hat nicht funktioniert. Ich habe das versucht:

(1) mw.resizable (width = False, height = False)

Ich kann mir nicht vorstellen, was das Problem ist, ich bin wirklich verzweifelt.

13
Mr. Squiddy

Sie schalten pack_propagate aus, indem Sie pack_propagate(0) einstellen.

Das Deaktivieren von pack_propagate sagt im Wesentlichen, dass die Widgets nicht die Größe des Frames beeinflussen dürfen. Sie haben also Breite und Höhe auf 500 festgelegt. Durch das Deaktivieren der Propagierungs-Standbilder kann diese Größe gewählt werden, ohne dass die Widgets die Größe des Frames ändern, um ihre jeweilige Breite/Höhe auszufüllen, was normalerweise der Fall ist

Um die Größenänderung des Stammfensters zu deaktivieren, können Sie root.resizable(0, 0) festlegen, wobei die Größenänderung in den Richtungen x und y zulässig ist.

Um ein Maxsize-Fenster für ein Fenster festzulegen, wie in der anderen Antwort angegeben, können Sie das maxsize-Attribut oder minsize festlegen, obwohl Sie die Geometrie des Stammfensters einfach festlegen und dann die Größenänderung deaktivieren können. Ein bisschen flexibler imo.

Immer wenn Sie grid oder pack in einem Widget festlegen, wird None zurückgegeben. Wenn Sie also einen Verweis auf das Widgetobjekt beibehalten möchten, sollten Sie keine Variable auf ein Widget setzen, in dem Sie grid oder pack aufrufen. Sie sollten stattdessen die Variable als Widget Widget(master, ....) festlegen und dann stattdessen pack oder grid im Widget aufrufen.

import tkinter as tk

def startgame():

    pass

mw = tk.Tk()

#If you have a large number of widgets, like it looks like you will for your
#game you can specify the attributes for all widgets simply like this.
mw.option_add("*Button.Background", "black")
mw.option_add("*Button.Foreground", "red")

mw.title('The game')
#You can set the geometry attribute to change the root windows size
mw.geometry("500x500") #You want the size of the app to be 500x500
mw.resizable(0, 0) #Don't allow resizing in the x or y direction

back = tk.Frame(master=mw,bg='black')
back.pack_propagate(0) #Don't allow the widgets inside to determine the frame's width / height
back.pack(fill=tk.BOTH, expand=1) #Expand the frame to fill the root window

#Changed variables so you don't have these set to None from .pack()
go = tk.Button(master=back, text='Start Game', command=startgame)
go.pack()
close = tk.Button(master=back, text='Quit', command=mw.destroy)
close.pack()
info = tk.Label(master=back, text='Made by me!', bg='red', fg='black')
info.pack()

mw.mainloop()
20
Pythonista

Wenn Sie möchten, dass ein Fenster als Ganzes eine bestimmte Größe hat, können Sie ihm mit dem Befehl geometry die gewünschte Größe zuweisen. Das ist wirklich alles, was Sie tun müssen.

Zum Beispiel:

mw.geometry("500x500")

Sie sollten jedoch auch sicherstellen, dass die Widgets innerhalb des Fensters die Größe korrekt ändern. Ändern Sie daher, wie Sie den Rahmen hinzufügen:

back.pack(fill="both", expand=True)
5
Bryan Oakley

Es gibt 2 Lösungen für Ihr Problem:

  1. Entweder legen Sie eine feste Größe des Tkinter-Fensters fest; mw.geometry('500x500')

OR

  1. Passen Sie den Rahmen automatisch an die Größe des Fensters an. back.place(x = 0, y = 0, relwidth = 1, relheight = 1)

* Die zweite Option sollte anstelle von back.pack() verwendet werden

2
user6763977

Versuchen Sie parent_window.maxsize(x,x);, um die maximale Größe festzulegen. Es sollte nicht größer werden, selbst wenn Sie den Hintergrund usw. einstellen.

Edit: benutze parent_window.minsize(x,x) auch, um die Größe konstant zu halten!

0
Sid Sahay