在不使用内置主题的情况下更改 ttk.Progressbar 颜色
Change ttk.Progressbar colour without using a built in theme
我正在使用一个与标签配对的进度条来提供一个进度条,该进度条在给定一个值时会更新一个百分比。我试图让进度条在达到特定阈值时改变颜色(目前只是在每个季度)。
我做了一些阅读,发现我可以使用 ttk.Style 来做到这一点,而且我已经开始工作了。但是,我 运行 遇到的问题是,更改样式以使用主题会更改我父 UI 中的其他 ttk 小部件,这是应该的。这不是我想要的,因为我只想更改进度条的颜色。但是,当我尝试在不使用主题的情况下创建样式时,进度条的颜色不会改变。任何帮助将不胜感激。小部件的代码是:
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.root = parent
# ttk style
self.style = ttk.Style()
## self.style.theme_use("clam")
self.style.configure("green.Horizontal.TProgressbar", foreground="green", background="green")
self.style.configure("blue.Horizontal.TProgressbar", foreground="blue", background="blue")
self.style.configure("yellow.Horizontal.TProgressbar", foreground="yellow", background="yellow")
self.style.configure("orange.Horizontal.TProgressbar", foreground="orange", background="orange")
self.style.configure("red.Horizontal.TProgressbar", foreground="red", background="red")
# Progressbar, percent label
self.progress = ttk.Progressbar(self, orient = orient,
length = length, mode = mode, style = "orange.Horizontal.TProgressbar")
self.text = tk.StringVar()
self.text.set("0%")
self.percent = tk.Label(self, textvariable = self.text)
self.percent.grid(column=0, row=0)
self.progress.grid(column=1, row=0)
def value(self, value):
# Progressbar updates based on input value
self.progress['value'] = value
percent_value = round(value, 1)
self.text.set(str(percent_value) + '%')
alert = False
if value < 25:
self.progress.configure(style = "green.Horizontal.TProgressbar")
elif 25 <= value < 50:
self.progress.configure(style = "blue.Horizontal.TProgressbar")
elif 50 <= value < 75:
self.progress.configure(style = "yellow.Horizontal.TProgressbar")
elif 75 <= value <= 100:
self.progress.configure(style = "orange.Horizontal.TProgressbar")
elif 100 <= value:
alert = True
self.progress.configure(style = "red.Horizontal.TProgressbar")
self.alert(alert)
def alert(self, alert):
if alert == True:
self.percent.configure(fg = 'red')
else:
self.percent.configure(fg = 'black')
if __name__ == "__main__":
root = tk.Tk()
progress = ProgressBarPercent(root, orient = tk.HORIZONTAL,
length = 100, mode = 'determinate')
progress.grid()
progress.value(67.322)
root.mainloop()
如果您只想改变颜色,则不需要 5 种不同的新样式。您可以配置一个,以获得不同的颜色
if value < 25:
self.style.configure("TProgressbar", foreground="green", background="green")
elif 25 <= value < 50:
self.style.configure("TProgressbar", foreground="blue", background="blue")
elif 50 <= value < 75:
self.style.configure("TProgressbar", foreground="yellow", background="yellow")
elif 75 <= value <= 100:
self.style.configure("TProgressbar", foreground="orange", background="orange")
elif 100 <= value:
alert = True
self.style.configure("TProgressbar", foreground="red", background="red")
我正在使用一个与标签配对的进度条来提供一个进度条,该进度条在给定一个值时会更新一个百分比。我试图让进度条在达到特定阈值时改变颜色(目前只是在每个季度)。
我做了一些阅读,发现我可以使用 ttk.Style 来做到这一点,而且我已经开始工作了。但是,我 运行 遇到的问题是,更改样式以使用主题会更改我父 UI 中的其他 ttk 小部件,这是应该的。这不是我想要的,因为我只想更改进度条的颜色。但是,当我尝试在不使用主题的情况下创建样式时,进度条的颜色不会改变。任何帮助将不胜感激。小部件的代码是:
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.root = parent
# ttk style
self.style = ttk.Style()
## self.style.theme_use("clam")
self.style.configure("green.Horizontal.TProgressbar", foreground="green", background="green")
self.style.configure("blue.Horizontal.TProgressbar", foreground="blue", background="blue")
self.style.configure("yellow.Horizontal.TProgressbar", foreground="yellow", background="yellow")
self.style.configure("orange.Horizontal.TProgressbar", foreground="orange", background="orange")
self.style.configure("red.Horizontal.TProgressbar", foreground="red", background="red")
# Progressbar, percent label
self.progress = ttk.Progressbar(self, orient = orient,
length = length, mode = mode, style = "orange.Horizontal.TProgressbar")
self.text = tk.StringVar()
self.text.set("0%")
self.percent = tk.Label(self, textvariable = self.text)
self.percent.grid(column=0, row=0)
self.progress.grid(column=1, row=0)
def value(self, value):
# Progressbar updates based on input value
self.progress['value'] = value
percent_value = round(value, 1)
self.text.set(str(percent_value) + '%')
alert = False
if value < 25:
self.progress.configure(style = "green.Horizontal.TProgressbar")
elif 25 <= value < 50:
self.progress.configure(style = "blue.Horizontal.TProgressbar")
elif 50 <= value < 75:
self.progress.configure(style = "yellow.Horizontal.TProgressbar")
elif 75 <= value <= 100:
self.progress.configure(style = "orange.Horizontal.TProgressbar")
elif 100 <= value:
alert = True
self.progress.configure(style = "red.Horizontal.TProgressbar")
self.alert(alert)
def alert(self, alert):
if alert == True:
self.percent.configure(fg = 'red')
else:
self.percent.configure(fg = 'black')
if __name__ == "__main__":
root = tk.Tk()
progress = ProgressBarPercent(root, orient = tk.HORIZONTAL,
length = 100, mode = 'determinate')
progress.grid()
progress.value(67.322)
root.mainloop()
如果您只想改变颜色,则不需要 5 种不同的新样式。您可以配置一个,以获得不同的颜色
if value < 25:
self.style.configure("TProgressbar", foreground="green", background="green")
elif 25 <= value < 50:
self.style.configure("TProgressbar", foreground="blue", background="blue")
elif 50 <= value < 75:
self.style.configure("TProgressbar", foreground="yellow", background="yellow")
elif 75 <= value <= 100:
self.style.configure("TProgressbar", foreground="orange", background="orange")
elif 100 <= value:
alert = True
self.style.configure("TProgressbar", foreground="red", background="red")