【问题标题】:Notebook widget in TkinterTkinter 中的笔记本小部件
【发布时间】:2010-09-22 00:06:41
【问题描述】:

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

对该主题进行一点谷歌搜索可以提供一些建议。 a cookbook entry 有一个类允许您使用选项卡,但它非常原始。 SourceForge 上还有 Python megawidgets,虽然这看起来很旧,并且在安装过程中给了我错误。

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

【问题讨论】:

    标签: python wxpython tabs tkinter


    【解决方案1】:

    在最近的 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 网站上的 webpage

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

    【讨论】:

    • 很遗憾,当我尝试在我的 Windows 机器上使用 Tix.NoteBook 类时出现错误。如果我决定将 Tkinter 用于任何主要的事情,这看起来确实是一条路,但是从源代码编译所有内容的努力对于一个小项目来说是令人望而却步的。
    • 其实我自己想出来的;在线 Python Tix 资源的数量非常少,如果不出意外,我可能会发布一个 Stack Overflow 问题。再次感谢使用 Tix 的建议。
    • tix 已经很老了,支持也不是很好。未来最好的解决方案是 ttk.Notebook。从 tk 版本 8.5 开始,有主题小部件 (ttk),其中包括一个笔记本。
    【解决方案2】:

    如果有人还在寻找,我已经在 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()
    

    【讨论】:

    • 现代版本的 tkinter 带有 ttk 包,它有一个原生选项卡小部件。没有理由再建立自己的了。见tkdocs.com/tutorial/complex.html#notebook
    • 哦,我应该对此进行更多研究。我需要使用 tkinter 进行分发,并且不认为 tab 是其中的一部分。哦,好吧,我自己做很有趣,但我想我最终会使用 ttk 包以获得更好的支持:P。感谢您的提醒!
    【解决方案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 现在包括对开箱即用的主题小部件的支持。 _

    【讨论】:

    • 甜蜜!我一定会检查一下。谢谢,我绝对同意 Python 在 GUI 方面落后于其他语言;我想问题在于它经常用于 Web 编程和其他服务器/脚本软件,以至于 GUI 工作并不是大多数开发人员的优先事项。
    【解决方案4】:

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

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

    【讨论】:

    • “好多了”绝对是主观的。使用包含主题小部件的最新版本 Tkinter,Tkinter 看起来与任何其他跨平台工具包一样现代。
    【解决方案5】:

    您在使用 pmw 时遇到了什么问题?它很旧,是的,但它是纯 python,所以它应该可以工作。

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

    【讨论】:

    • 我的问题是 setup.py 脚本不起作用。后来我通过简单地将 Pmw 目录复制到站点包中来安装它。但是这种错误再加上包的陈旧,让我舍不得用。至少 wxPython 是最新的,虽然我还是更喜欢 Tkinter。
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多