Блокнот для ноутбуков в Ткинтере
Вопрос
Поэкспериментировав немного и с Tkinter, и с wxPython, мне больше нравится Tkinter с точки зрения чистоты моего исходного кода. Тем не менее, он, кажется, не так много функций; в частности, он не имеет вкладок (как, например, вкладок в верхней части окна Firefox).
Небольшой поиск в Google по этой теме предлагает несколько предложений. Есть запись в кулинарной книге с классом, позволяющим использовать вкладки, но он очень примитивен. В SourceForge также есть мегавиджеты Python , хотя это кажется очень старым и приводило к ошибкам во время установки.
Есть ли у кого-нибудь опыт создания графических интерфейсов с вкладками в Tkinter? Что ты использовал? Или просто тот, кто нуждается в более мощных оконных компонентах, должен использовать wxPython?
Решение
В последних версиях Python (> 2.7) вы можете использовать ttk Модуль
, обеспечивающий доступ к набору тематических виджетов Tk , который был представлен в Tk 8.5
.
Вот как вы импортируете ttk
в Python 2:
import ttk
help(ttk.Notebook)
В Python 3 < Модуль code> 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
.
Другие советы
Если кто-то еще смотрит, у меня это работает как 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()
Хотя это может не помочь вам в данный момент, 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. ком / . Р>
Tk 8.5 - это огромное улучшение по сравнению со стандартным Tk. Он вводит несколько новых виджетов, нативных виджетов и движка тем. Надеемся, что он будет доступен по умолчанию в Tkinter когда-нибудь в ближайшее время. Жаль, что мир Python отстает от других языков.
Обновление: последние версии Python теперь включают поддержку тематических виджетов из коробки. _
" Или просто тот, кому нужны более мощные оконные компоненты, должен использовать wxPython? "
Краткий ответ: да.
Длинный ответ: Вашему коду wxPython может потребоваться некоторое время, чтобы почувствовать себя «чистым» но он приятнее и намного мощнее, чем Tkinter. Вы также получите лучшую поддержку, поскольку в наши дни ее используют все больше людей.
Какие у вас были проблемы с pmw? Это старый, да, но это чистый питон, поэтому он должен работать.
Обратите внимание, что Tix не работает с py2exe, если это проблема для вас.