【问题标题】:Why does the same program look different when run in Windows and Linux?为什么相同的程序在 Windows 和 Linux 中运行时看起来不同?
【发布时间】:2017-09-02 05:05:55
【问题描述】:

我编写了一个简单的 Python 应用程序来测量某个事件的时间。一切正常,但在两个不同的操作系统上看起来完全不同的事实让我有点头疼。我可以做些什么吗?为什么会这样?我的意思是,最后,代码是一样的。

# str8.py
#   Program to measure time from a certain event

from tkinter import *
from datetime import datetime

class FormatLabel(Label):

    # A new type of Label widget that allows both text and textvariable

    def __init__(self, master = None, **kwargs):

        self.textvariable = kwargs.pop('textvariable', StringVar(master))
        self.text = kwargs.pop('text', '{}')
        self.textvariable.trace('w', self.update_text)

        Label.__init__(self, master, **kwargs)

    def update_text(self, *args):

        self.config(text = self.text.format(self.textvariable.get()))

class App(Frame):

    def __init__(self, master = None, **kwargs):

        Frame.__init__(self, master, **kwargs)

        lbl = Label(self, text = 'You have been STR8 for:\n', font = 'Verdana 8 bold')
        lbl.grid(row=0, sticky=W)

        self.counters = dict()
        measurements = [ 'Years', 'Weeks', 'Days', 'Hours', 'Minutes', 'Seconds' ]

        for i, measurement in enumerate(measurements):

            self.counters[measurement] = DoubleVar()

            lbl = FormatLabel(self,
                              text = measurement + ": {:.2f}", # set the rounding here
                              textvariable = self.counters[measurement],
                              font = 'Verdana 8')
            lbl.grid(row = i + 1, column = 0, sticky = W)

            self.counters[measurement].set(0)

        btn = Button(self,
                     text = 'EXIT',
                     font = 'Verdana 8',
                     height = 1,
                     width = 19,
                     command = quit)
        btn.grid(row = 7, column = 0)

        self.increment()

    def increment(self):

        event = datetime(2017, 4, 4, 0, 0, 0)
        today = datetime.now()

        str8 = (today - event).total_seconds()

        self.counters['Minutes'].set(str8 / 60.)
        self.counters['Hours'].set(str8 / 3600.)
        self.counters['Seconds'].set(str8)
        self.counters['Days'].set(str8 / (3600. * 24))
        self.counters['Weeks'].set(str8 / (3600. * 24 * 7))
        self.counters['Years'].set(str8 / (3600. * 24 * 7 * 52))

        self.after(1000, self.increment)

def main():

    root = Tk()
    app = App(root)
    app.pack()
    root.title("STR8")
    root.resizable(width = False, height = False)
    app.mainloop()

if __name__ == '__main__':
    main()

图片:

【问题讨论】:

  • Tkinter(和一般的 tk)使用操作系统窗口管理器的原生 GUI 构建块。我怀疑你能做些什么。
  • 它们看起来不同的原因与 Windows 和 Linux 通常看起来不同的原因相同。别担心。
  • @zondo 您实际上应该担心它,因为一个操作系统中的某些参数可能不会像在其他操作系统中那样(根本)生效。
  • 是的,我很担心,因为 Windows 中没有显示标题,而且按钮也被扭曲了。
  • 完全不同?他们在我看来几乎不同。相同的按钮,相同的文字,相同的组织,或多或少相同的大小......

标签: python linux windows tkinter


【解决方案1】:

tkinter 并非设计为在每个平台上看起来都一样。相反,它专门设计为在每个平台上看起来都不同。它旨在工作相同,但不一定外观相同。只要有可能,它就会使用底层操作系统的小部件工具包来绘制小部件(即:您将在 OSX 上获得类似 OSX 的按钮,在窗口上获得类似窗口的按钮等)

tkinter 的主要目标是在所有平台上运行相同的代码并以相同的方式工作,但尽可能遵守平台准则。

【讨论】:

  • 非常感谢您,先生。所以,我什么都做不了?
  • @venom1337:这取决于你对“任何东西”的定义。您可以更改字体,也可以更改颜色(OSX 除外),还可以更改间距量。一个标签有十几个属性。只是实验。通常你不应该做任何事情——你应该让你的应用看起来适合它运行的平台。 Windows 用户不希望看到看起来像 linux 的应用。
  • @venom1337 你不应该做任何事。同一系统上看起来不同的两个窗口非常不和谐。总有一对的程序认为它们非常重要以至于可以违反规则......或者只是使用过时的工具包。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2011-12-25
相关资源
最近更新 更多