20

在玩过 Tkinter 和 wxPython 之后,我更喜欢 Tkinter,因为我的源代码看起来很干净。但是,它似乎没有那么多功能。特别是它没有标签(如 Firefox 窗口顶部的标签)。

关于这个主题的一点谷歌搜索提供了一些建议。有一个食谱条目,其中包含一个允许您使用选项卡的类,但它非常原始。SourceForge 上还有Python megawidgets,虽然这看起来很旧并且在安装过程中给了我错误。

有没有人有在 Tkinter 中制作选项卡式 GUI 的经验?你用了什么?或者仅仅是任何需要更强大的窗口组件的人都必须使用 wxPython 的情况?

4

5 回答 5

23

在最近的 Python (> 2.7) 版本中,您可以使用该ttk模块,该模块提供对Tk 主题小部件集的访问,该小部件集已在Tk 8.5.

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

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

另一种选择是使用库中的NoteBook小部件tkinter.tix。要使用tkinter.tix,您必须Tix安装小部件,通常在安装Tk小部件的同时安装。要测试您的安装,请尝试以下操作:

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

有关更多信息,请查看PSF 网站上的此网页。

请注意,它tix已经很旧并且没有得到很好的支持,因此您最好的选择可能是使用ttk.Notebook.

于 2008-11-12T17:32:26.493 回答
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()
于 2013-09-20T17:02:01.213 回答
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 现在包括对开箱即用的主题小部件的支持。_

于 2008-11-13T20:20:33.027 回答
0

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

长答案:您的 wxPython 代码可能需要一些练习才能感觉“干净”,但它比 Tkinter 更好、更强大。您还将获得更好的支持,因为现在有更多的人使用它。

于 2008-11-12T15:58:20.880 回答
0

pmw 有什么问题吗?它很旧,是的,但它是纯 python,所以它应该可以工作。

请注意,Tix 不适用于 py2exe,如果这对您来说是个问题。

于 2008-11-12T22:34:39.160 回答