【问题标题】:Python - Tkinter fix object positionPython - Tkinter 修复对象位置
【发布时间】:2018-05-08 11:00:33
【问题描述】:

我目前正在使用 python GUI 进行测试,并制作了一个脚本,该脚本从 2 个文本字段中获取 2 个输入的数字,并在按下按钮时生成一个标签块(例如,我输入 4 和 5,因此它会生成一个 4x5 的标签字段)

但现在我想这样做:当我生成对象时,我想阻止它们 - 移动 - 重叠 我当前的对象(按钮、文本字段)。 我可以为重叠找到一些东西,但是每次我生成新东西时,一切都会移动。我可以将网格中的特定字段设置为“保留”,这样新的东西就不会进入那里吗?

这是我目前的尝试 - 如您所见,它不再重叠,但如果生成雪花,文本框和按钮仍会“跳跃”一小段距离

编辑:“跳跃”是由于添加的雪花的字体大小造成的——这仍然让我对如何防止这种情况产生疑问,因为我不想局限于小字体

from tkinter import *
wide = 0
deep = 0
entrytext = "test"
window = Tk()
window.title("test")
window.geometry('1000x1000')


ent = Entry(window)
ent.grid(column=0, row=1)

def GetClicked():
    global wide
    wide = ent.get()
    wide = int(wide)

btn2 = Button(window, text="Width", command=GetClicked)
btn2.grid(column=0, row=2)

ent2 = Entry(window)
ent2.grid(column=0, row=3)

def GetClicked2():
    global deep
    deep = ent2.get()
    deep = int(deep)

btn = Button(window, text="Depth", command=GetClicked2)
btn.grid(column=0, row=4)

def WingBut(column,row):
    lbl = Label(window, text="T", font=("Wingdings", 15))
    lbl.grid(column=column, row=row)
def clicked(wide,deep):
    h = 0
    j = 0
    while h in range (deep):
        i = 0
        h += 1
        while i in range(wide):
             if i > 2 or j > 5:
                 WingBut(i,j)
             i += 1
             if i == wide:
                 j += 1


btn = Button(window, text="Buttonspam",font=("Arial", 10),command=lambda: clicked(wide,deep))
btn.grid(column=0, row=0)






window.mainloop()

【问题讨论】:

  • 您可以尝试通过将padx 和/或pady 传递给grid 来使用填充。在你做的时候Label(...).grid(padx=10, pady=20)
  • 添加代码示例可能有助于更好地理解您的问题。
  • 添加它,测试它看看我的意思 - 对象在生成新对象时会稍微跳跃
  • 当我点击你的任何按钮时什么都没有发生。可能是因为你的代码缩进好像坏了。
  • 啊,也许我应该解释一下 - 您必须在 2 个文本框中输入数字,然后按“宽度”和“高度”按钮将变量更改为该数字,然后按大生成雪花的按钮(是的,这 2 个按钮有点多余,我猜有时会将它们的功能移到大按钮上)

标签: python user-interface tkinter


【解决方案1】:

文本框和按钮仍然“跳跃”一小段距离

这是由于动态添加的标签(标记为“T”的标签)的最终大小高于每行的当前行高。因为必须增加行大小以适应新标签,所以同一行中的其他小部件也会调整大小,以使行的整体高度保持一致。调整大小会导致跳跃效果。

纠正它的一种方法是减小“T”标签的字体大小。尝试将其设置为 10,问题应该会消失。

解决它的另一种方法是将每行的minsize 设置为该行中最高小部件的高度,例如“T”标签小部件高度。

for row in range(5):
    window.rowconfigure(row, minsize=36)

您可以在调用window.mainloop()之前添加上述代码。

我选择 36 是因为这使行的高度至少为 36 像素,这足以在我的系统上显示“T”而不会导致行大小调整。

如果您不想硬编码minsize,您可以动态计算它。

dummy = Label(window, text="T", font=("Wingdings", 20))
dummy.grid(row=0, column=0)
dummy.update_idletasks()        # seems to be required to get rendered size
height = dummy.winfo_height()
dummy.grid_forget()             # we don't want users seeing this widget

for row in range(5):
    window.rowconfigure(row, minsize=height)

这是一种方法。可能有更好、更直接的方式使用字体本身,但如果您有兴趣,可以研究一下。

【讨论】:

  • 啊,这正是我所期待的,但有点令人失望——我认为可以用按钮和文本框“框定”该区域?不得不减小字体大小在这里有点令人沮丧,一个更干净的解决方法可能是“拆分”网格 - 但我猜最小大小也可以解决,至少感觉更好。感谢您的建议
猜你喜欢
  • 2021-10-18
  • 2016-11-09
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2021-05-02
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多