<p>除非为多个小部件指定了相同的小部件样式(或者由于未指定其他内容而将相同的默认样式分配给多个小部件),否则不会共享小部件样式</p>
<p>为了利用这一点,这里有一个更新版本的代码,用于我的<a href="https://stackoverflow.com/a/58922734/355230">answer</a>到另一个问题。为了确保每个<code>Progressbar</code>实例的独立性,它从内置的<code>ttk.Progressbar</code>派生一个新类,该类为创建的每个实例创建一个单独的样式对象</p>
<p>下面是代码以及最后的可运行演示</p>
<pre><code>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()
</code></pre>
<p>下面是它运行的几个屏幕截图:</p>
<p><a href="https://i.stack.imgur.com/FgFxJ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/FgFxJ.png" alt="screenshots of it running"/></a></p>