Tkinter中的笔记本小部件

20 投票
5 回答
46449 浏览
提问于 2025-04-11 18:28

我尝试过Tkinter和wxPython这两个工具,发现Tkinter的代码看起来更整洁,我更喜欢它。不过,Tkinter似乎功能没有那么多,特别是它没有像Firefox窗口顶部那样的标签页。

我在网上查了一下,找到了一些建议。有一个食谱,里面有一个类可以让你使用标签页,但功能很简单。另外还有一个Python megawidgets,在SourceForge上可以找到,不过这个看起来很旧,安装的时候还出错了。

有没有人有在Tkinter中制作带标签页的图形界面的经验?你们用了什么工具?还是说需要更强大窗口组件的人只能用wxPython呢?

相关问题:

5 个回答

3

虽然现在可能对你没什么帮助,但tk 8.5版本带来了更多的控件。这些额外的控件在tk 8.4版本中可以通过一个叫“tile”的扩展来使用。这个扩展中包含了一个笔记本控件。不过可惜的是,Tkinter默认使用的Tk版本比较旧,所以没有这些新控件。

为了让Tkinter能够使用tile,已经有人在努力。你可以看看这个链接: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现在已经默认支持这些主题控件了。

8

如果还有人关注这个问题,我已经在tkinter中实现了一个标签页功能。你可以试着修改这个代码,让它按照你想要的方式运行(比如,你可以添加一个按钮来新增一个标签页):

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()
23

在最近的Python版本(大于2.7)中,你可以使用ttk模块,这个模块可以让你使用到Tk主题小部件集合,这个集合是在Tk 8.5中引入的。

在Python 2中,你可以这样导入ttk

import ttk

help(ttk.Notebook)

在Python 3中,ttk模块作为tkinter的一个子模块,随标准发行版一起提供。

这里有一个简单的示例,基于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网站上的这个网页

需要注意的是,tix比较老旧,支持不是很好,所以你最好的选择可能是使用ttk.Notebook

撰写回答