Python/tkinter:添加条目小部件会隐藏我的 canvas 项
Python/tkinter: Adding an Entry widget hides my canvas items
对于我正在制作的游戏,我需要用户输入数据,并且我想调用一个方法来向我的 GUI 添加一个小输入框(以获取用户名),但是当我尝试这样做 Entry 小部件基本上会掩盖所有其他内容并使它们消失。关于为什么会发生这种情况或如何解决的任何想法?这是有问题的代码的示例:
root = tkinter.Tk()
root.title('2048')
width = 500
height = 800
root.geometry('%sx%s' % (width, height))
canvas = tkinter.Canvas(root, width=width, height=height, highlightthickness=0)
canvas.pack()
r = canvas.create_rectangle(0, 0, 50, 50)
canvas.move(r, 50, 50)
def keyed(event):
e = tkinter.Entry(canvas)
e.pack()
canvas.bind('<Key>', keyed)
canvas.focus_set()
root.mainloop()
这是使用 pack
或 grid
时的标准行为 - 小部件将扩大或缩小以适应其内容。当您在 canvas 中打包条目时,canvas 将缩小或增大以适合 canvas。这称为 几何传播 。
至少有三种方法可以解决这个问题。第一种是 而不是 将小部件放在 canvas 中。相反,将其放在上方、下方或一侧(例如:e = tkinter.Entry(root)
)
另一个解决方案是不使用pack
(或grid
)。相反,使用 canvas create_window
方法使条目小部件成为第一个 class canvas 对象。你必须决定把它放在哪里,因为 create_window
方法需要一个 x/y 坐标。
第三个选项是继续使用 pack
但关闭几何传播。我个人认为这个特性几乎不应该被使用。小部件增大或缩小这一事实是一项功能而不是错误,而且它是一项可以更轻松地创建响应式用户界面的功能。
要关闭 canvas 的几何传播,如果您继续使用 pack
,您可以调用 canvas.pack_propagate(False)
,如果您切换到使用内部网格,则可以调用 canvas.grid_propagate(False)
canvas.
对于我正在制作的游戏,我需要用户输入数据,并且我想调用一个方法来向我的 GUI 添加一个小输入框(以获取用户名),但是当我尝试这样做 Entry 小部件基本上会掩盖所有其他内容并使它们消失。关于为什么会发生这种情况或如何解决的任何想法?这是有问题的代码的示例:
root = tkinter.Tk()
root.title('2048')
width = 500
height = 800
root.geometry('%sx%s' % (width, height))
canvas = tkinter.Canvas(root, width=width, height=height, highlightthickness=0)
canvas.pack()
r = canvas.create_rectangle(0, 0, 50, 50)
canvas.move(r, 50, 50)
def keyed(event):
e = tkinter.Entry(canvas)
e.pack()
canvas.bind('<Key>', keyed)
canvas.focus_set()
root.mainloop()
这是使用 pack
或 grid
时的标准行为 - 小部件将扩大或缩小以适应其内容。当您在 canvas 中打包条目时,canvas 将缩小或增大以适合 canvas。这称为 几何传播 。
至少有三种方法可以解决这个问题。第一种是 而不是 将小部件放在 canvas 中。相反,将其放在上方、下方或一侧(例如:e = tkinter.Entry(root)
)
另一个解决方案是不使用pack
(或grid
)。相反,使用 canvas create_window
方法使条目小部件成为第一个 class canvas 对象。你必须决定把它放在哪里,因为 create_window
方法需要一个 x/y 坐标。
第三个选项是继续使用 pack
但关闭几何传播。我个人认为这个特性几乎不应该被使用。小部件增大或缩小这一事实是一项功能而不是错误,而且它是一项可以更轻松地创建响应式用户界面的功能。
要关闭 canvas 的几何传播,如果您继续使用 pack
,您可以调用 canvas.pack_propagate(False)
,如果您切换到使用内部网格,则可以调用 canvas.grid_propagate(False)
canvas.