问题是使用ttk进度栏的网格vs包

问题描述 投票:-1回答:1

我正在尝试创建一个将标准进度条与一个标签一起显示的进度条类,该标签显示进度条的填充百分比。然后可以更新此值以显示完成百分比。类本身可以正常工作,但是尝试将小部件和类本身都放置在两个问题上。

[当我使用pack(side = tk.LEFT)时,小部件会正确包装在班级中。但是,当我在主程序(由网格管理)中使用此类时,标签消失。

[其次,在我的类中使用具有正确列间距的grid()将两个小部件堆叠在一起,而不是按预期的方式并排放置。尝试在主程序中使用该类时,出现错误:

_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()
python tkinter grid-layout ttk pack
1个回答
0
投票

您没有将标签设为班级的子级,因此它成为了根窗口的子级。根据一般经验,类中继承自其他小部件的所有小部件均应为self的子级或后代。

self.percent = tk.Label(self, textvariable = self.text)
                        ^^^^^^

这样,您可以在pack中使用gridProgressBarPercent,并且在父级中使用一个,它们将彼此独立。

© www.soinside.com 2019 - 2024. All rights reserved.