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

时间:2014-08-17 22:14:46

标签: python tkinter

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

Windows 8 windows 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()

2 个答案:

答案 0 :(得分: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上有更大的边框。我对该小部件一无所知,因此它可能具有基于平台的不同默认值。

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

答案 1 :(得分:2)

有可能吗?

虽然这似乎是一个自然的愿望,但由于Tk / Tcl依赖localhost O / S窗口管理器服务的许多原因,目标是不可能的。在这里开始。 {MacOS,Linux OS,W * OS} -WM-s肯定会执行类似的任务,但是没有相同的外观。

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

最接近的打击可能是使用&#34; Tk Themed Widget&#34;图书馆,a.k.a。 ttk

from Tkinter import *
from ttk import *

使用ttk构建带有ttk.&lt; 小部件&gt;的GUI-s,其中11个已经存在于Tkinter中: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 - 所有这些都很舒适&#34;子类&#34;来自Widget。

关键问题是主题

外观以及样式代码(+ ttk样式配置工作)尝试帮助实现更好的跨平台UI外观。

虽然这会让您更接近,但在X11终端和W7上看起来并不容易。