答案 0 :(得分:3)
我认为“默认操作系统主题”有点区分大小写... xpnative 与原生主题相近,几乎欺骗了眼睛。我创建了一个测试来查看差异(请注意,我使用的是 Windows 7),并且像 xpnative 这样的默认操作系统样式显示的结果是赢家。 vista 看起来相同,但只是更大一些。现在,如果操作系统使用简单主题,这两个将不起作用,但其他将起作用...对于 Windows 10,经典 tkinter 主题与此 OS 主题接近,但 tkinter.ttk 在 Windows 10 上会做同样的事情......是敏感这个话题。只是在 Windows 上是一些障碍,我什至没有提到 Linux...主题不是那么重要,如果你的项目做得对并且足够接近用户操作系统的默认主题,从我的角度来看是非常完美的。
这是我的测试:
# Import
import tkinter as tk
import tkinter.ttk as ttk
# Logic
class Main:
def __init__(self, master):
self.master = master
# Create the progress bar
self.progress = ttk.Progressbar(self.master, value=0)
self.progress.pack(expand=False, fill="x", side="top", padx=5, pady=5)
self.progress.start()
# Create two layers for the theme
self.default = self.Layer("Default") # for default foundet ones
self.custom = self.Layer("Custom") # for manual input and debug purpose
# Create the entry and applay elements for the "custom layer"
self.entry = ttk.Entry(self.custom)
ttk.Button(self.custom, text="Apply...", width=15, command=lambda:self.ChangeTheme(self.entry.get().strip())
).pack(side="right")
self.entry.pack(expand=True, fill="x", side="left")
# Get a list of all default themes and create a button for each one
for theme in ttk.Style().theme_names(): self.ThemeDefault(theme)
def ThemeDefault(self, themeName:str) -> None:
ttk.Button(self.default, text=themeName, width=15, command=lambda:self.ChangeTheme(themeName)).pack(side="left")
def Layer(self, text:str) -> tk.Frame:
frame = tk.Frame(self.master)
label = tk.Label(frame, text=text, width=7, anchor="w")
frame.pack(expand=False, fill="x", side="top", padx=5, pady=5)
label.pack(side="left")
return frame
def ChangeTheme(self, themeName:str) -> None:
try: ttk.Style(self.master).theme_use(themeName)
except Exception as e: print(f">> EXCEPTION // {e}")
# Run if this file is the main opened one
if __name__ == "__main__":
root = tk.Tk()
Main(root)
root.mainloop()
答案 1 :(得分:1)
不幸的是,“真正的原生”小部件在 Tk 中是不可能的。正如您在 source 中看到的那样,主题只是设置了一堆设置,它不会做任何您自己做不到的事情。但是,找到一个好的主题通常会“足够好”(有关详细信息,请参阅 ASI's answer)。
如果您不相信我,请查看 ProgressbarDoLayout
方法(和相关方法 - found here),您可以看到 Tk 正在处理绘图本身,并且几乎没有给原生软件。
答案 2 :(得分:0)
试试这个 -
from tkinter import *
from tkinter import ttk
root = Tk()
s = ttk.Style()
s.theme_use('winnative')
s.configure("Blue.Horizontal.TProgressbar", foreground='white',
background='blue')
P1 = ttk.Progressbar(root, style="Blue.Horizontal.TProgressbar",
orient="horizontal", length=600, mode="indeterminate",
maximum=4, value=1)
P1.pack()
root.mainloop()