将 grid vs pack 用于 ttk Progressbar 的问题
Issues using grid vs pack for ttk Progressbar
我正在尝试创建一个进度条 class,它结合了标准进度条和显示进度条填充百分比的标签。然后可以更新此值以显示完成百分比。 class 本身工作正常,但是尝试将小部件放在 class 和 class 本身中有两个问题。
当我使用 pack(side = tk.LEFT)
时,小部件在 class 中正确打包。然而,当我在我的主程序(由网格管理)中使用这个 class 时,标签消失了。
其次,在我的 class 中使用具有正确列间距的 grid()
将两个小部件堆叠在一起,而不是按预期并排放置。尝试在我的主程序中使用 class 时,出现错误:
_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
代码在这里:
import tkinter as tk
import tkinter.ttk as ttk
class ProgressBarPercent(tk.Frame):
def __init__(self, parent, orient, length, mode):
tk.Frame.__init__(self, parent)
self.progress = ttk.Progressbar(self, orient = orient,
length = length, mode = mode)
self.text = tk.StringVar()
self.text.set("0%")
self.percent = tk.Label(textvariable = self.text)
self.percent.grid(column=0, row=0)
self.progress.grid(column=1, row=0)
def value(self, value):
self.progress['value'] = value
percent_value = round(value, 1)
self.text.set(str(percent_value) + '%')
if __name__ == "__main__":
root = tk.Tk()
progress = ProgressBarPercent(root, orient = tk.HORIZONTAL,
length = 100, mode = 'determinate')
progress.grid()
progress.value(37.322)
root.mainloop()
您没有将标签设为 class 的子标签,因此它成为根 window 的子标签。作为一般经验法则,class 中继承自某个其他小部件的所有小部件都应该是 self
.
的子代或后代
self.percent = tk.Label(self, textvariable = self.text)
^^^^^^
这样,你就可以在ProgressBarPercent
中使用pack
或grid
,在parent中使用任何一个,它们将相互独立。
我正在尝试创建一个进度条 class,它结合了标准进度条和显示进度条填充百分比的标签。然后可以更新此值以显示完成百分比。 class 本身工作正常,但是尝试将小部件放在 class 和 class 本身中有两个问题。
当我使用 pack(side = tk.LEFT)
时,小部件在 class 中正确打包。然而,当我在我的主程序(由网格管理)中使用这个 class 时,标签消失了。
其次,在我的 class 中使用具有正确列间距的 grid()
将两个小部件堆叠在一起,而不是按预期并排放置。尝试在我的主程序中使用 class 时,出现错误:
_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid
代码在这里:
import tkinter as tk
import tkinter.ttk as ttk
class ProgressBarPercent(tk.Frame):
def __init__(self, parent, orient, length, mode):
tk.Frame.__init__(self, parent)
self.progress = ttk.Progressbar(self, orient = orient,
length = length, mode = mode)
self.text = tk.StringVar()
self.text.set("0%")
self.percent = tk.Label(textvariable = self.text)
self.percent.grid(column=0, row=0)
self.progress.grid(column=1, row=0)
def value(self, value):
self.progress['value'] = value
percent_value = round(value, 1)
self.text.set(str(percent_value) + '%')
if __name__ == "__main__":
root = tk.Tk()
progress = ProgressBarPercent(root, orient = tk.HORIZONTAL,
length = 100, mode = 'determinate')
progress.grid()
progress.value(37.322)
root.mainloop()
您没有将标签设为 class 的子标签,因此它成为根 window 的子标签。作为一般经验法则,class 中继承自某个其他小部件的所有小部件都应该是 self
.
self.percent = tk.Label(self, textvariable = self.text)
^^^^^^
这样,你就可以在ProgressBarPercent
中使用pack
或grid
,在parent中使用任何一个,它们将相互独立。