【问题标题】:Tkinter window not opening, but if I comment out a line, it worksTkinter 窗口未打开,但如果我注释掉一行,它可以工作
【发布时间】:2022-01-20 21:12:30
【问题描述】:

所以我正在尝试在 pygame 中创建一个 GUI,但过了一段时间,我决定在 tkinter 中重新编写它。我需要创建 3 个条,一个是画布,另一个是空的。左侧栏的大小为leftbarwidth,右侧为rightbarwidth,分别设置为200 和300。到目前为止我有这个(不包括程序的逻辑)

 1 from tkinter import *
 2 
 3 def windowsizeupdate(event):
 4     preview.config(width=event.width-leftbarwidth-rightbarwidth, height=event.height)
 5 
 6 root = Tk()
 7 root.title("TITLE HERE")
 8 root.geometry(f"{leftbarwidth + rightbarwidth + 200}x600+{int(screen.winfo_screenwidth() / 2 - (leftbarwidth + rightbarwidth + 200) / 2)}+{int(screen.winfo_screenheight() / 2 - 300)}")
 9 root.minsize(800, 600)
10 root.attributes("-topmost", 1)
11
12 preview = Canvas(root, bd=0, bg="#800000", cursor="dot", width=200, height=600)
13 preview.place(x=leftbarwidth, y=0)
14
15 root.bind("<Configure>",windowsizeupdate)
16 root.mainloop()

但是每当我运行它时,我都会得到这个:

在注释掉第 4 行并将其替换为 print(event.width-leftbarwidth-rightbarwidth, event.height, leftbarwidth) 后,我发现 一切正常,所有值都应该与 config 函数一起使用!

但是如果我输入这个:

 1 from tkinter import *
 2 
 3 def windowsizeupdate(event):
 4     print(event.width-leftbarwidth-rightbarwidth, event.height, leftbarwidth)
 5     preview.config(width=event.width-leftbarwidth-rightbarwidth, height=event.height)
 6 
 7 root = Tk()
 8 root.title("TITLE HERE")
 9 root.geometry(f"{leftbarwidth + rightbarwidth + 200}x600+{int(screen.winfo_screenwidth() / 2 - (leftbarwidth + rightbarwidth + 200) / 2)}+{int(screen.winfo_screenheight() / 2 - 300)}")
10 root.minsize(800, 600)
11 root.attributes("-topmost", 1)
12
13 preview = Canvas(root, bd=0, bg="#800000", cursor="dot", width=200, height=600)
14 preview.place(x=leftbarwidth, y=0)
15
16 root.bind("<Configure>",windowsizeupdate)
17 root.mainloop()

我看到我的控制台输出如下所示:

谁能给我解释一下!

【问题讨论】:

  • 请不要发布带有行号的代码,这会使我们难以复制和粘贴您的代码。

标签: python tkinter


【解决方案1】:

因为当您调整窗口大小时,会引发另一个 &lt;Configure&gt; 事件并调用您的处理程序。您需要检测到您的更改并未触发事件:

def windowsizeupdate(event):
     if event.x != leftbarwidth:
        preview.config(width=event.width-leftbarwidth-rightbarwidth, 
height=event.height)

【讨论】:

  • 你误解了我想要做什么。虽然这可能只是函数名。如果调整窗口大小,请保持左右栏的大小相同,并更改预览的大小。该函数不会改变窗口的大小,它会改变窗口中一个小部件的大小,那么它如何调用它自己呢?
  • @TheMystZ:您不需要使用&lt;Configure&gt; 事件来完成此操作。
  • 不,我明白你想做什么。当您更改 ANY 窗口的大小时,会引发 &lt;Configure&gt;。当我回去测试时,“忙碌”的东西并没有起作用,但我想你可以通过检查X位置来检测它不是预览窗口。
  • 谢谢,新的答案奏效了!
【解决方案2】:

如果您的目标是将左侧和右侧窗口保持为固定大小,则无需通过&lt;Configure&gt; 事件的绑定来实现。这类事情正是几何管理器packplacegrid 的用途。

您正在使用place,这使得这个问题更难解决,因为很难让一个小部件的宽度来填充其他小部件之间的空间。更好的解决方案是使用gridpack

例如,使用grid,您可以为左右列设置最小尺寸,然后让中间列填充所有额外的空间。

from tkinter import *

leftbarwidth = 200
rightbarwidth = 300

root = Tk()
root.minsize(800, 600)
preview = Canvas(root, bd=0, bg="#800000", cursor="dot", width=200, height=600)

root.grid_columnconfigure(0, minsize=leftbarwidth)
root.grid_columnconfigure(2, minsize=rightbarwidth)
root.grid_columnconfigure(1, weight=1)
root.grid_rowconfigure(0, weight=1)
preview.grid(row=0, column=1, sticky="nsew")

root.mainloop()

【讨论】:

  • 在这种情况下使用place() 并不难:preview.place(x=leftbarwidth, y=0, relwidth=1, width=-leftbarwidth-rightbarwidth, relheight=1)
  • @acw1668:我想你是对的,尽管我仍然坚信 packgrid 对大多数布局问题都有优势。
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多