【问题标题】:How do I make my ttk widgets look modern?如何让我的 ttk 小部件看起来很现代?
【发布时间】:2011-07-01 17:17:30
【问题描述】:

我在 mac 上遇到 tkinter.ttk 的问题。我正在使用 macports 和 python3.1。当我尝试使用 tkinter.ttk 时,我得到了非常古老的 gui 元素。

例如:我明白了

而不是这个:

我使用的代码是:

from tkinter import *
from tkinter import ttk
root = Tk()
button = ttk.Button(root, text="Hello World").grid()
root.mainloop()

我很乐意从我的计算机中提供回答此问题所需的任何信息。由于我是新手程序员,请告诉我在哪里可以找到上述信息。

我有一台装有 Snow Leopard 的 Macbook 5,2。任何帮助将不胜感激。
谢谢,马伦

问题更新:
我安装了 tk @8.5.9_0+quartz 作为 schlenk 建议只得到这个错误:

TclMacOSXNotifierAddRunLoopMode: Tcl not built with CoreFoundation support Abort trap

我使用来自https://trac.macports.org/ticket/22954 的补丁修复了这个错误。我按照信中的指示(他们是):

$ cd /opt/local/var/macports/sources/rsync.macports.org/release/ports/lang/tcl
$ sudo patch < ~/Downloads/tcl.2.patch 
$ sudo port install tcl 

这产生了一个新错误:

Traceback (most recent call last):
  File "hello.py", line 5, in <module>
    root = Tk()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/tkinter/__init__.py", line 1632, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable tk.tcl in the following directories: 
    /opt/local/lib/tcl8.5/tk8.5 /opt/local/lib/tcl8.5/tk8.5/Resources/Scripts /opt/local/lib/tk8.5 /opt/local/lib/tk8.5/Resources/Scripts /opt/local/Library/Frameworks/Python.framework/Versions/3.1/Resources/Python.app/Contents/lib/tk8.5 /opt/local/Library/Frameworks/Python.framework/Versions/3.1/Resources/Python.app/Contents/lib/tk8.5/Resources/Scripts /opt/local/Library/Frameworks/Python.framework/Versions/3.1/Resources/Python.app/lib/tk8.5 /opt/local/Library/Frameworks/Python.framework/Versions/3.1/Resources/Python.app/Contents/library

/opt/local/lib/tk8.5/tk.tcl: version conflict for package "Tk": have 8.5.7, need exactly 8.5.9
version conflict for package "Tk": have 8.5.7, need exactly 8.5.9
    while executing
"package require -exact Tk  8.5.9"
    (file "/opt/local/lib/tk8.5/tk.tcl" line 20)
    invoked from within
"source /opt/local/lib/tk8.5/tk.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 [list source $file]"


This probably means that tk wasn't installed properly.

【问题讨论】:

  • 我什至不再有我试图让它工作的计算机,而且它太旧以至于[可能]不再相关,所以我将它标记为@回答schlenk,因为他们在回答问题上付出了最多的努力。

标签: user-interface python-3.x tkinter macports ttk


【解决方案1】:

问题可能是macports。您可以使用三个版本的 Tk 作为 ttk 的基础。屏幕截图看起来很像旧的 X11 Tk,而不是基于 aqua 的 Tk。 1. 通过 X11 进行 Tk。 2. 使用 Carbon 'windowingsystem -aqua' 编译的 Tk 3. 使用Cocoa编译的Tk

因此,您应该尝试通过 macports 构建一个 Tk 变体“quartz”,或者您应该获得一些已经构建了正确版本的预构建版本(例如 ActiveStates)。

那就试试吧:

sudo port build tk @8.5.9+quartz

查看此处的教程以获得更多指导: http://www.tkdocs.com/tutorial/install.html#installmac

【讨论】:

  • 使用 tk @8.5.9_0+quartz (active) 当我运行 hello.py(我的问题中的代码)时,我收到错误 TclMacOSXNotifierAddRunLoopMode: Tcl not使用 CoreFoundation 构建支持中止陷阱。如果我解决了这个问题,我会发布解决方案。
  • 我按照trac.macports.org/ticket/22954 的修补说明修复了这个错误。当然,这造成了另一个错误......我会更新我的问题,因为这个错误相当复杂。
  • 事情的悲惨状态的一个原因是 OS X 上的大多数 Tcl/Tk 开发现在都是为 Cocoa (decarbon) 分支完成的,所以从这里开始可能会更容易:trac.macports.org/ticket/20799
  • tk+quartz 实际上构建没有错误,当我运行我的测试程序时出现错误。
【解决方案2】:

试试

style = ttk.Style()
print(style.theme_names())
style.theme_use('default') # change 'default' to something better

【讨论】:

    【解决方案3】:

    我没有玩过 ttk,但是我对 tkinter 有相当多的经验。我相信你必须填写 style 关键字参数。

    我认为它看起来像这样。

    from tkinter import *
    from tkinter import ttk
    root = Tk()
    button = ttk.Button(root, text="Hello World", style="somestyle").grid()
    root.mainloop()
    

    一些相关文档的链接: http://docs.python.org/release/3.1.3/library/tkinter.ttk.html

    【讨论】:

    • 恐怕我没有解释清楚,再说一遍。默认应该看起来像图像 B。相反,它看起来像图像 A。为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2013-11-17
    相关资源
    最近更新 更多