【问题标题】:How to display text in two different Progressbars with tkinter?如何使用 tkinter 在两个不同的进度条中显示文本?
【发布时间】:2021-11-28 11:23:03
【问题描述】:

我有一个带有两个不同Progressbars 的窗口。我想在它们上添加不同的文本信息(即第一个上的“88/1524”和第二个上的“88/10000”)。 我在这个问题上找到了一个Progressbar 的解决方案:Displaying percentage in ttk progressbar

但是,它使用样式修改解决方法在进度条上添加文本,据我了解,样式属性text.Horizontal.TProgressbar 是所有进度条共享的。这意味着我不能在每个进度条上使用不同的文本。当我需要更新文本时,我不知道如何定位一个特定的进度条。

还有其他方法可以做到吗,还是我错过了什么? 我可以将标签实例化为text.Horizontal.TProgressbar1text.Horizontal.TProgressbar2 之类的东西吗?

这是我当前没有标签的设置:

我被困在哪里:

以及我的部分代码:

style = tkinter.ttk.Style(root)

style.layout('text.Horizontal.TProgressbar', 
            [('Horizontal.Progressbar.trough',
            {'children': [('Horizontal.Progressbar.pbar',
                            {'side': 'left', 'sticky': 'ns'})],
                'sticky': 'nswe'}), 
            ('Horizontal.Progressbar.label', {'sticky': ''})])
style.configure('text.Horizontal.TProgressbar', text='0/0')

ProgressBarOfDirectory = tkinter.ttk.Progressbar(ProgressbarFrame,
                                                 style='text.Horizontal.TProgressbar',
                                                 orient="horizontal",
                                                 length=WidthOfElements,
                                                 mode="determinate",
                                                 maximum=NbStepOfProgressBar,
                                                 variable=PourcentageOfDirectoryAnalysisDone)
ProgressBarOfDirectory.pack(side="top")

ProgressBarOfAll = tkinter.ttk.Progressbar(ProgressbarFrame,
                                           style='text.Horizontal.TProgressbar',
                                           orient="horizontal",
                                           length=WidthOfElements,
                                           mode="determinate",
                                           maximum=NbStepOfProgressBar,
                                           variable=PourcentageOfAllAnalysisDone)

【问题讨论】:

    标签: python tkinter text styles progress-bar


    【解决方案1】:

    进度条没有单独显示文本的功能。

    您可以做的是使用标签小部件。您所要做的就是将一个 Label 小部件放置在您想要实现文本的任何位置。

    现在您可以配置标签的文本值并可以随着 Python Tkinter 进度条中的更改而更改它。

    这里你可以找到一个例子:

    from tkinter import *
    from tkinter.ttk import Progressbar
    import time
    
    
    def step():
        for i in range(5):
            ws.update_idletasks()
            pb['value'] += 20
            time.sleep(1)
            txt['text']=pb['value'],'%'
    
    ws = Tk()
    ws.title('PythonGuides')
    ws.geometry('200x150')
    ws.config(bg='#345')
    
    
    pb = Progressbar(
        ws,
        orient = HORIZONTAL,
        length = 100,
        mode = 'determinate'
        )
    
    pb.place(x=40, y=20)
    
    txt = Label(
        ws,
        text = '0%',
        bg = '#345',
        fg = '#fff'
    
    )
    
    txt.place(x=150 ,y=20 )
    
    Button(
        ws,
        text='Start',
        command=step
    ).place(x=40, y=50)
    
    ws.mainloop()
    

    【讨论】:

      【解决方案2】:

      小部件样式不会共享,除非它为多个小部件指定了相同的样式(或者由于未指定其他内容而将相同的默认样式分配给多个小部件)。

      为了利用这一点,这里是我的answer 的代码的更新版本到另一个问题。为了确保每个Progressbar 实例的独立性,它从内置ttk.Progressbar 派生一个新类,该类为创建的每个实例创建一个单独的样式对象。

      下面是代码以及最后的可运行演示。

      import tkinter as tk
      import tkinter.ttk as ttk
      
      class MyProgressBar(ttk.Progressbar):
          _inst_count = 0  # Number of class instances created.
      
          def __init__(self, *args, **kwargs):
              classname = type(self).__name__
              assert 'style' not in kwargs, \
                     f'{classname} initializer does not support providing a ttk "style".'
              type(self)._inst_count += 1  # Increment class attribute.
              # Create a style with a different name for each instance.
              self.style = ttk.Style(root)
              self.stylename = f'text.Horizontal.TProgressbar{self._inst_count}'
              self.style.layout(self.stylename,
                                [('Horizontal.Progressbar.trough',
                                  {'children': [('Horizontal.Progressbar.pbar',
                                                 {'side': 'left', 'sticky': 'ns'})],
                                   'sticky': 'nswe'}),
                                 ('Horizontal.Progressbar.label', {'sticky': ''})])
              maximum = kwargs['maximum']
              self.style.configure(self.stylename, text=f'0/{maximum}')
              kwargs.update(style=self.stylename)
              super().__init__(*args, **kwargs)
      
      
      if __name__ == '__main__':
      
          DELAY1 = 100
          DELAY2 = 25
          MAX1 = 1524
          MAX2 = 10000
      
          def progress_bar_func(delay, progress_bar):
              # Start periodic progress-bar update process.
              maximum = progress_bar.cget('maximum')
              style = progress_bar.style  # Progressbar must have a style attribute.
              root.after(delay, update_progress_bar, delay, style, progress_bar, 1, maximum)
      
          def update_progress_bar(delay, style, progress_bar, num, maximum):
              if num <= maximum:
                  progress_bar.config(value=num)
                  style.configure(progress_bar.stylename, text=f'{num}/{maximum}')
                  num += 1
                  root.after(delay, update_progress_bar, delay, style, progress_bar, num, maximum)
      
          root = tk.Tk()
          root.geometry("300x300")
      
          progress_bar1 = MyProgressBar(root, length=200, maximum=MAX1, value=0)
          progress_bar1.pack()
          progress_bar2 = MyProgressBar(root, length=200, maximum=MAX2, value=0)
          progress_bar2.pack()
      
          def start_progress_bars():
              progress_bar_func(DELAY1, progress_bar1)
              progress_bar_func(DELAY2, progress_bar2)
      
          progress_button = tk.Button(root, text="Start", command=start_progress_bars)
          progress_button.pack()
      
          root.mainloop()
      

      这是它运行的几个屏幕截图:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多