Tkinter在不同的计算机上看起来不同

Ada*_*ter 5 python tkinter

我的tkinter窗口在不同的计算机上看起来非常不同(运行在相同的分辨率上!):

窗户8 窗户8

Windows 7的 Windows 7的

我希望它看起来像第一个.有任何想法吗?

我的代码看起来像这样:

class Application():
    def __init__(self):
        self.app = Tk()
        self.app.wm_iconbitmap('.\data\spider.ico')
        self.app.wm_title("Spider Crawler")
        self.app.minsize(width=914, height=331)
        self.app.maxsize(width=914, height=331)

        mainmainleft = Frame(self.app)
        bottom = Frame(self.app)

        mainleft = Frame(mainmainleft)
        itemoptions = Frame(bottom)
        self.graph = multilist.McListBox(bottom)

        startn = Frame(mainleft)
        options = Frame(mainleft)
        hourcredits = Frame(mainleft)

        hoursoption = Frame(hourcredits)
        credits = Frame(hourcredits)

        allbuttons = Frame(mainleft)

        fstart = Frame(startn)

        bp = Frame(allbuttons)
        buttons = Frame(allbuttons)

        self.SchemaUpdate = BooleanVar()
        self.reset = BooleanVar()
        self.genuine = BooleanVar()
        self.buds = BooleanVar()
        self.bills = BooleanVar()
        self.unusual = BooleanVar()
        self.maxs = BooleanVar()
        self.bmoc = BooleanVar()
        self.salvage = BooleanVar()
        self.traded = BooleanVar()
        self.entryid = StringVar()

        self.clicked = False

        for i in [self.reset, self.buds, self.unusual, self.maxs, self.salvage]:
            i.set(True)

        self.b = Button(fstart, text="START", command=self.start)
        c = Button(buttons, text="Steam", command=self.steam).pack(side=LEFT, padx=(0,7))
        d = Button(buttons, text="GotoBP", command=self.backpack).pack(side=LEFT)
        self.b.pack(side=LEFT)

        buttons.pack()
        self.var = StringVar(self.app)
        self.var.set("backpack.tf/profiles/")

        option = OptionMenu(bp, self.var, "backpack.tf/profiles/", "tf2items.com/profiles/", "tf2b.com/tf2/")
        option.config(width = 18)
        option.pack()
        bp.pack(side = BOTTOM)    

        self.box = Entry(startn, textvariable=self.entryid, fg = "gray")
        self.box.bind("<Button-1>", self.callback)
        self.box.insert(0, "Enter steamid")
        self.box.pack(side = TOP, anchor=N, padx =(5,25), pady = 10)

        Label(credits, text="Created by Akenne", font=("Times New Roman", 8)).pack(anchor = E, pady = (0,25))

        credits.pack(side=TOP, anchor=E)

        Label(hoursoption, text="Max Hours:").pack(side=LEFT, padx = (0,10))

        self.hours=IntVar()
        self.hours.set(250)
        Entry(hoursoption,textvariable=self.hours,width=5).pack(side=LEFT)

        hoursoption.pack(padx= (0,45))

        Checkbutton(options, text = "Reload item schema", variable = self.SchemaUpdate).pack(side=TOP, anchor=W, pady =(0, 3))
        Checkbutton(options, text = "Start with fresh id", variable = self.reset).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Only never traded items", variable = self.traded).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Genuines", variable = self.genuine).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Earbuds", variable = self.buds).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Bill's", variable = self.bills).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Unusuals", variable = self.unusual).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Max's items", variable = self.maxs).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "BMOCs", variable = self.bmoc).pack(side=TOP, anchor=W)
        Checkbutton(itemoptions, text = "Salvaged crates", variable = self.salvage).pack(side=TOP, anchor=W)
        self.lbl = Label(fstart, text="0/0 found")
        self.lbl.pack(side = LEFT, anchor = W, padx = (20,30))

        fstart.pack(side=TOP)

        startn.pack(side=LEFT, anchor = W, padx = (10, 0))
        options.pack(side=LEFT, padx=(0,30), pady = (5,0))
        allbuttons.pack(side=LEFT, pady=(10,0), padx = (40,0))
        hourcredits.pack(side=LEFT, padx = (95,0), anchor = E)

        mainleft.pack(side = TOP, anchor = W)
        self.graph.container.pack(side = LEFT, anchor = W, pady = 10)
        itemoptions.pack(side=LEFT, anchor = E, padx=7)

        mainmainleft.pack(side = TOP, fill = X)
        bottom.pack(padx =10)
        self.app.mainloop()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 5

是的,tkinter应用程序在不同平台上看起来会有所不同.这是设计的.如果可能,Tkinter将使用本机小部件 - 操作系统提供的小部件.这意味着Tkinter无法最终控制GUI的各个方面.

在大多数情况下,这是期望的行为.您希望Windows上的按钮看起来像Windows按钮,并且您希望OSX上的按钮看起来像OSX按钮.这也意味着你可以在Windows 7上获得与Windows 8不同的按钮 - tkinter只是使用操作系统提供的任何按钮,而且微软倾向于在每个主要版本中调整其小部件.

你能在所有平台上获得完全相同的外观吗?那要看.通过少量工作,您可以在Windows 7和8上获得几乎相同的结果.在Windows和Macintosh之间获得相同的外观将非常困难.

不幸的是,这些差异不仅会导致看起来不同的小部件,而且还会导致布局差异.例如,不同的平台可能具有不同的字体,不同的默认边框宽度以及默认边距和填充.所有这些都有助于窗口的最终布局.

在您的特定情况下,最明显的区别是Windows 7使用的字体略小于Windows 8.仅此一项就可以对布局产生很大影响.似乎McListBox小部件在Windows 7上的边框比在Windows 8上有更大的边框.我对该小部件一无所知,因此它可能具有基于平台的不同默认值.

大多数这些问题可以通过使用边框,填充,字体等的显式值来解决.有时需要一些实验.


use*_*197 3

是否可以?

虽然这似乎是一个自然的愿望,但由于 Tk/Tcl 依赖本地主机 O/S 窗口管理器服务的多种原因,该目标是不可能的。从这里开始。{ MacOS、Linux OS、W* OS }-WM-s 确实可以执行类似的任务,但是外观和感觉并不相同。

最简单的是在第二行几何管理器输出的相当不同的结果上看到的,那里.pack()只有一些微不足道的Button()-s

最接近的可能是使用“Tk Themed Widget”库,又名ttk

from Tkinter import *
from ttk import *
Run Code Online (Sandbox Code Playgroud)

当您用< Widgetsttk >构建 GUI时,Tkinter 中已经存在 11 个: ttk.Button、ttk.Checkbutton、ttk.Entry、ttk.Frame、ttk.Label、ttk.LabelFrame、ttk.Menubutton、ttk.PanedWindow 、ttk.Radiobutton、ttk.Scale 和 ttk.Scrollbar 以及一些新的小部件类被添加 - Combobox、Notebook、Progressbar、Separator、Sizegrip 和 Treeview - 所有这些都是 Widget 的“子类”。ttk.

关键问题是主题

外观和风格代码(+ ttk 样式配置工作)试图帮助实现更好的跨平台 UI 外观。

虽然这让您更接近,但在 X11 终端和 W7 上拥有相同的外观并不容易。