如何将 tkinter 窗口设置为恒定大小

新手上路,请多包涵

我正在用 tkinter 编写一个小游戏,简而言之,我被卡住了。

我有一种奇怪的开始菜单,其中有两个按钮和一个标签。

如果我只是创建框架,一切都很好,它的大小为 500x500 像素

我希望在创建按钮和标签时背景不会改变,但无论我做什么,它都会调整大小。这是我的代码:

 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()

我在 stackoverflow 上四处搜索,没有得到任何有用的信息!我发现只有一个问题与我的有点相似,但答案没有用。我试过这个:

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

我无法想象问题出在哪里,我真的很绝望。

原文由 Mr. Squiddy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 972
2 个回答

你关闭 pack_propagate 通过设置 pack_propagate(0)

关闭 pack_propagate 这里基本上是说不要让框架内的小部件控制它的大小。所以你已经将它的宽度和高度设置为 500。关闭 propagate stills 允许它是这个大小,而小部件不会改变框架的大小来填充它们各自的宽度/高度,这是正常情况下会发生的

要关闭调整根窗口的大小,您可以设置 root.resizable(0, 0) ,其中允许在 xy 方向调整大小

要将最大尺寸设置为窗口,如其他答案中所述,您可以设置 maxsize 属性或 minsize 尽管您可以只设置根窗口的几何形状,然后关闭调整大小。 imo 更灵活一点。

每当您在小部件上设置 gridpack 时,它将返回 None 。因此,如果您希望能够保留对小部件对象的引用,则不应在调用 gridpack 的小部件上设置变量。您应该将变量设置为小部件 Widget(master, ....) 然后在小部件上调用 packgrid

 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()

原文由 Pythonista 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您希望整个窗口具有特定的大小,您可以使用 geometry 命令为其指定所需的大小。这就是您真正需要做的。

例如:

 mw.geometry("500x500")

不过,您还需要确保窗口内的小部件正确调整大小,因此请更改将框架添加到此的方式:

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

原文由 Bryan Oakley 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题