Python / tkinter:添加Entry小部件会隐藏我的画布项目

对于我正在制作的游戏,我需要用户输入数据,并且我想调用一种在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,50,50)
canvas.move(r,50)


def keyed(event):
    e = tkinter.Entry(canvas)
    e.pack()


canvas.bind('<Key>',keyed)
canvas.focus_set()
root.mainloop()
d520y 回答:Python / tkinter:添加Entry小部件会隐藏我的画布项目

这是您使用packgrid时的标准行为-窗口小部件会根据其内容而增大或缩小。当您在画布中打包一个条目时,画布将缩小或增长以适合画布。这称为几何传播

至少有三种方法可以解决此问题。首先是将小部件放在画布中。而是将其放在上方,下方或一侧(例如:e = tkinter.Entry(root)

另一种解决方案是使用pack(或grid)。而是使用canvas create_window方法使条目窗口小部件成为一流的canvas对象。由于create_window方法需要x / y坐标,因此您必须决定将其放置在何处。

第三个选择是继续使用pack,但关闭几何图形传播。我个人认为,几乎不应使用此功能。小部件的增大或缩小这一事实是一个功能,而不是一个错误,它是使创建响应用户界面更容易的功能。

要关闭画布的几何传播,如果继续使用canvas.pack_propagate(False),则可以调用pack;如果切换到在画布内部使用网格,则可以调用canvas.grid_propagate(False)

本文链接:https://www.f2er.com/2886772.html

大家都在问