Python Tkinter 标签未正确移动

Posted

技术标签:

【中文标题】Python Tkinter 标签未正确移动【英文标题】:Python Tkinter label not moving properly 【发布时间】:2021-12-02 09:10:13 【问题描述】:
label = tk.Label(frame, text=app.split('/')[-1:][0] + "\n", bg="#1c1c1c",
padx=5, pady=5, font=("Helvetica 12 bold"), fg="white")
label.grid(row=0, column=0)

此代码应该生成标签(制作新标签是通过单独的函数完成的)并且标签应该从上到下,从窗口的左上角开始。我会使用label.pack() 但是label.pack() 只是让它从中间顶部到底部。这就是我使用label.grid(row=0, column=0) 的原因。但问题是新标签只是替换了先前存在的标签。有什么办法可以在仍然使用label.pack() 的同时修复移动标签?

完整的功能是 def addApps():

for widget in frame.winfo_children():
    widget.destroy()

filename = filedialog.askopenfilename(initialdir="/", title="Select File", 
filetypes= (("executables", "*.exe"), ("All files", "*.*")))
filename.split('/')[-1:][0]
apps.append(filename)
print("filename, apps")
for app in apps:
    label = tk.Label(frame, text=app.split('/')[-1:][0] + "\n", bg="#1c1c1c",
    padx=5, pady=5, font=("Helvetica 12 bold"), fg="white")
    label.grid(row=0, column=0)

【问题讨论】:

请提供说明问题的minimal reproducible example。您显示的代码仅在窗口的一个位置创建一个标签。 但这就是我的问题所在。 我在您的代码中没有看到您正在移动小部件的任何地方。您只是将它们全部放在同一行和同一列中。 如果您想主动移动小部件(如动画),我强烈建议使用tkinter.Canvas 而不是调用.pack().grid()。当您在与前一个相同的位置(在本例中为row=0, column=0)网格化一个小部件时,它替换它。 grid() 中相同“正方形”中的小部件不会相互移开。 【参考方案1】:

正如 Bryan 所说,您只是将标签放在一起。因为您不更改行或列坐标,所以标签堆叠在一起,最后放置的标签就是您将在顶部看到的标签。您需要更改grid() 中的行来堆叠它们。

以下示例使用grid()pack() 从上到下堆叠标签,向左对齐

网格:

for label_row, app in enumerate(apps):
    label = tk.Label(frame, text=app.split('/')[-1:][0] + "\n", bg="#1c1c1c",
    padx=5, pady=5, font=("Helvetica 12 bold"), fg="white")
    label.grid(row=label_row, column=0, sticky = tk.NW)

包装:

for app in apps:
    label = tk.Label(frame, text=app.split('/')[-1:][0] + "\n", bg="#1c1c1c",
    padx=5, pady=5, font=("Helvetica 12 bold"), fg="white")
    label.pack(anchor = tk.NW)

我建议您查看 grid()pack() 方法的工作原理以及两者的可用选项。

【讨论】:

以上是关于Python Tkinter 标签未正确移动的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 Tkinter标签虽然有效但未显示

如何在 Python Tkinter 的按钮下方移动单选按钮的文本标签?

pyqt tkinter哪个好用

使用继承正确扩展 tkinter 小部件

有没有办法在 tkinter 中正确显示标签边框?

Tkinter 单选按钮未正确选择