Проблемы с использованием grid vs pack для ttk Progressbar - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать класс индикатора выполнения, который сочетает в себе стандартный индикатор выполнения с меткой, показывающей процент заполнения индикатора. Это значение затем можно обновить, чтобы показать процент завершения. Сам класс работает нормально, но есть две проблемы с попыткой разместить как виджеты в классе, так и сам класс.

Когда я использую 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()

1 Ответ

0 голосов
/ 17 июня 2020

Вы не сделали метку дочерней по отношению к вашему классу, поэтому она становится дочерним элементом окна root. Как правило, все виджеты внутри класса, который наследуется от какого-либо другого виджета, должны быть дочерними или потомками self.

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

При этом вы можете использовать pack или grid внутри ProgressBarPercent, и либо один в родительском, и они будут независимы друг от друга.

...