python加载Windows deault loader

时间:2017-09-08 21:06:04

标签: python windows python-3.x tkinter

如何在python 3.x 中加载 os默认加载程序?我想要两者,指定的百分比和未知的进展。以下是Windows 10的屏幕截图: Loading - Known

Loading - Unknown

我希望它位于可能包含其他内容的同一窗口中。谢谢你的帮助!

3 个答案:

答案 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()

这就是结果的样子。 enter image description here

答案 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()