Блокнот для ноутбуков в Ткинтере - PullRequest
16 голосов
/ 12 ноября 2008

Немного поигравшись и с Tkinter, и с wxPython, мне больше нравится Tkinter с точки зрения чистоты моего исходного кода. Тем не менее, он, кажется, не так много функций; в частности, он не имеет вкладок (как, например, вкладок в верхней части окна Firefox).

Небольшой поиск в Google по этой теме предлагает несколько предложений. Есть запись в кулинарной книге с классом, позволяющим вам использовать вкладки, но это очень примитивно. На SourceForge также есть мегавиджеты Python , хотя это кажется очень старым и приводило к ошибкам при установке.

У кого-нибудь есть опыт создания графических интерфейсов с вкладками в Tkinter? Что ты использовал? Или просто тот, кто нуждается в более мощных оконных компонентах, должен использовать wxPython?

Ответы [ 5 ]

20 голосов
/ 12 ноября 2008

В последних версиях 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.

5 голосов
/ 20 сентября 2013

Если кто-то еще смотрит, у меня это работает как Tab в 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()
3 голосов
/ 13 ноября 2008

Хотя это может не помочь вам в данный момент, tk 8.5 поставляется с расширенным набором виджетов. Этот расширенный набор доступен с ТК 8.4 посредством расширения, известного как «плитка». В расширенный набор виджетов включен виджет для ноутбука. К сожалению, в настоящее время Tkinter по умолчанию использует довольно старую версию Tk, которая не поставляется с этими виджетами.

Были попытки сделать плитку доступной для 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 теперь включают поддержку тематических виджетов из коробки. _

0 голосов
/ 13 ноября 2008

Какие у вас были проблемы с pmw? Да, он старый, но это чистый питон, поэтому он должен работать.

Обратите внимание, что Tix не работает с py2exe, если это проблема для вас.

0 голосов
/ 12 ноября 2008

"Или это просто тот случай, когда любой, кому нужны более мощные оконные компоненты, должен использовать wxPython?"
Краткий ответ: да.

Длинный ответ: Чтобы код wxPython чувствовал себя «чистым», может потребоваться некоторая практика, но он лучше и намного мощнее, чем Tkinter. Вы также получите лучшую поддержку, поскольку в наши дни ее используют все больше людей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...