Tkinter中的笔记本小部件

20

我曾经试过使用Tkinter和wxPython,但我更喜欢Tkinter,因为它的源码更加干净。然而,与wxPython相比,它似乎缺少一些功能,特别是它没有选项卡(就像Firefox窗口顶部的选项卡)。

在网上搜索了一下,有几个建议。有一个厨房秘籍条目提供了一个类,可以让您使用选项卡,但非常简陋。还有Python megawidgets在SourceForge上,尽管它看起来非常老旧,在安装期间也会出现错误。

有没有人在Tkinter中制作过带有选项卡的GUI?你用的什么?或者只是因为需要更强大的窗口组件,所以必须使用wxPython?

5个回答

23

在最近的 Python 版本(> 2.7)中,您可以使用 ttk 模块,该模块提供了对 Tk themed widget 组件集的访问,这些组件集已经在 Tk 8.5 中引入。

以下是在 Python 2 中导入 ttk 的方法:

import ttk

help(ttk.Notebook)
在Python 3中,tkinter模块的一个子模块ttk是标准发行版的一部分。
这是一个简单的工作示例,基于TkDocs网站上的示例。
from tkinter import ttk
import tkinter as tk
from tkinter.scrolledtext import ScrolledText


def demo():
    root = tk.Tk()
    root.title("ttk.Notebook")

    nb = ttk.Notebook(root)

    # adding Frames as pages for the ttk.Notebook 
    # first page, which would get widgets gridded into it
    page1 = ttk.Frame(nb)

    # second page
    page2 = ttk.Frame(nb)
    text = ScrolledText(page2)
    text.pack(expand=1, fill="both")

    nb.add(page1, text='One')
    nb.add(page2, text='Two')

    nb.pack(expand=1, fill="both")

    root.mainloop()

if __name__ == "__main__":
    demo()

另一个选择是使用来自tkinter.tix库的NoteBook小部件。要使用tkinter.tix,您必须安装Tix小部件,通常与您安装的Tk小部件一起安装。为了测试您的安装,请尝试以下操作:

from tkinter import tix
root = tix.Tk()
root.tk.eval('package require Tix')

要了解更多信息,请查看PSF网站上关于tkinter.tix的页面。

请注意,tix相当古老且支持不佳,因此您最好选择ttk.Notebook


很遗憾,当我尝试在我的Windows电脑上使用Tix.NoteBook类时出现了错误。如果我决定在Tkinter中进行任何重要的工作,这似乎是正确的方法,但编译所有源代码的工作量对于小项目来说是不可行的。 - Eli Courtwright
实际上我自己解决了;网上Python Tix资源的数量非常有限,如果没有其他选择,我可能会在Stack Overflow上发帖询问。再次感谢您建议使用Tix。 - Eli Courtwright
6
tix相当古老且支持不太好。未来最好的解决方案是ttk.Notebook。从tk版本8.5开始,有主题小部件(ttk),其中包括一个笔记本。 - Bryan Oakley

8

如果有人仍在寻找,我已将其作为tkinter中的标签(Tab)实现。尝试修改代码以使其按照您想要的方式运行(例如,您可以添加按钮来添加新的标签页):

from tkinter import *

class Tabs(Frame):

    """Tabs for testgen output"""

    def __init__(self, parent):
        super(Tabs, self).__init__()
        self.parent = parent
        self.columnconfigure(10, weight=1)
        self.rowconfigure(3, weight=1)
        self.curtab = None
        self.tabs = {}
        self.addTab()                
        self.pack(fill=BOTH, expand=1, padx=5, pady=5)

    def addTab(self):
        tabslen = len(self.tabs)
        if tabslen < 10:
            tab = {}
            btn = Button(self, text="Tab "+str(tabslen), command=lambda: self.raiseTab(tabslen))
            btn.grid(row=0, column=tabslen, sticky=W+E)

            textbox = Text(self.parent)
            textbox.grid(row=1, column=0, columnspan=10, rowspan=2, sticky=W+E+N+S, in_=self)

            # Y axis scroll bar
            scrollby = Scrollbar(self, command=textbox.yview)
            scrollby.grid(row=7, column=5, rowspan=2, columnspan=1, sticky=N+S+E)
            textbox['yscrollcommand'] = scrollby.set

            tab['id']=tabslen
            tab['btn']=btn
            tab['txtbx']=textbox
            self.tabs[tabslen] = tab
            self.raiseTab(tabslen)

    def raiseTab(self, tabid):
        print(tabid)
        print("curtab"+str(self.curtab))
        if self.curtab!= None and self.curtab != tabid and len(self.tabs)>1:
                self.tabs[tabid]['txtbx'].lift(self)
                self.tabs[self.curtab]['txtbx'].lower(self)
        self.curtab = tabid


def main():
    root = Tk()
    root.geometry("600x450+300+300")
    t = Tabs(root)
    t.addTab()
    root.mainloop()

if __name__ == '__main__':
    main()

7
现代版本的tkinter附带了ttk包,其中包含原生的选项卡小部件。没有必要再自己构建了。请参阅http://www.tkdocs.com/tutorial/complex.html#notebook。 - Bryan Oakley
2
哦,我应该更深入地了解一下这个问题。我需要使用tkinter进行分发,但没有考虑到tab是其中的一部分。哎呀,自己制作确实很有趣,但我想最终还是会使用ttk包来获得更好的支持:P。谢谢提醒! - sPaz

3
虽然现在可能对您没有帮助,但tk 8.5附带了一组扩展小部件。通过称为“tile”的扩展,tk 8.4也可以使用这个扩展集。扩展小部件集中包含一个笔记本小部件。不幸的是,此时默认情况下Tkinter使用相当旧的Tk版本,不提供这些小部件。
已经有人努力使tile可用于Tkinter。请查看http://tkinter.unpythonic.net/wiki/TileWrapper。另一个类似的努力,请参见http://pypi.python.org/pypi/pyttk。此外,要了解这些小部件的外观(在Ruby、Perl和Tcl中),请访问http://www.tkdocs.com/
Tk 8.5比原始的Tk有了巨大的改进。它引入了几个新的小部件、本机小部件和主题引擎。希望它很快能够成为Tkinter的默认选项。可惜Python世界落后于其他语言。

更新:最新版本的Python现在已经默认支持主题小部件。


太好了!我一定会去看看的。谢谢,我完全同意Python在GUI方面落后于其他语言的问题;我想问题在于它经常用于Web编程和其他服务器/脚本软件,因此GUI工作对大多数开发人员来说并不是优先考虑的事情。 - Eli Courtwright

0

"或者说,任何需要更强大的窗口组件的人都必须使用wxPython吗?"
简短回答:是的。

长话短说: 你可能需要一些练习才能让你的wxPython代码感觉“干净”,但它比Tkinter更好,而且功能更强大。由于现在有更多的人使用它,你也会得到更好的支持。


5
“Much nicer” 明显是主观的。随着 Tkinter 的最新版本中包含了主题小部件,Tkinter 看起来和其他跨平台工具包一样现代化。 - Bryan Oakley

0
你在使用pmw时遇到了什么问题?虽然它有点老,但是它是纯Python编写的,所以应该能够正常工作。
请注意,如果你使用py2exe,Tix可能无法正常工作,如果这对你造成了问题,请注意。

我的问题是setup.py脚本无法工作。后来我通过将Pmw目录简单地复制到site-packages中进行了安装。但这种错误加上软件包的老旧使我不愿使用它。至少wxPython是当前的,尽管我仍然更喜欢Tkinter。 - Eli Courtwright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接