Widget Notebook em Tkinter
Pergunta
Tendo jogado em torno de um pouco com tanto Tkinter e wxPython, eu como Tkinter muito melhor em termos de como limpar meus olhares de código fonte. No entanto, não parece ter tantos recursos; em particular, não tem guias (como, as abas no topo de uma janela do Firefox).
Um pouco pesquisando sobre o assunto ofertas algumas sugestões. Há um livro de receitas entrada com uma classe que lhe permite usar as abas, mas é muito primitivo. Há também Python megawidgets no SourceForge, embora isso parece muito velho e me deu erros durante a instalação.
Alguém tem experiência em fazer com abas GUIs em Tkinter? O que você usou? Ou é simplesmente o caso que qualquer um que precisa de componentes de janelas mais poderosas tem que usar wxPython?
Solução
Em recente Python (> 2,7) versões, você pode usar o ttk
módulo, que permite o acesso ao Tk temático Widget set, que foi introduzido em Tk 8.5
.
Aqui está como você importar ttk
em Python 2:
import ttk
help(ttk.Notebook)
Em Python 3, o ttk
módulo vem com as distribuições padrão como um sub-módulo de tkinter
.
Aqui está um exemplo simples de trabalho com base em um exemplo de href="http://www.tkdocs.com/tutorial/complex.html" rel="noreferrer"> TkDocs
site :
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()
Outra alternativa é usar o widget NoteBook
da biblioteca tkinter.tix
. Para usar tkinter.tix
, você deve ter os widgets Tix
instalado, geralmente ao lado de sua instalação dos widgets Tk
. Para testar a instalação, tente o seguinte:
from tkinter import tix
root = tix.Tk()
root.tk.eval('package require Tix')
Para mais informações, confira este webpage no site do PSF .
Note que tix
é bastante antiga e bem-suportado, então a melhor opção poderia ser a de ir para ttk.Notebook
.
Outras dicas
Se alguém ainda está procurando, eu tenho esta trabalhando como guia em tkinter. Brincar com o código para fazê-lo funcionar da maneira que quiser (por exemplo, você pode adicionar botão para adicionar uma nova guia):
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()
Enquanto ele não pode ajudá-lo no momento, tk 8.5 vem com um vasto conjunto de widgets. Este conjunto estendida está disponível com tk 8,4 por meio de uma extensão conhecida como "telha". Incluído no conjunto alargado de widgets é um widget de notebook. Infelizmente, neste momento Tkinter por padrão utiliza uma versão bastante antiga de Tk que não vem com esses widgets.
Tem havido esforços para tornar telha disponível para Tkinter. Confira http://tkinter.unpythonic.net/wiki/TileWrapper . Por outro esforço semelhante consulte http://pypi.python.org/pypi/pyttk . Além disso, para um gosto de como estes elementos olhar (em Ruby, Perl e Tcl) ver http: //www.tkdocs. com / .
Tk 8.5 é uma enorme melhoria em relação estoque Tk. Ele apresenta vários novos widgets, widgets nativos, e um motor de temas. Esperamos que ele estará disponível por padrão no Tkinter algum dia em breve. Pena que o mundo Python está ficando para trás outras línguas.
update: As últimas versões do Python agora incluem suporte para os widgets temáticos fora da caixa. _
"Ou é simplesmente o caso que qualquer um que precisa de componentes de janelas mais poderosas tem que usar wxPython?"
Resposta curta: Sim.
A resposta mais completa: Pode levar um pouco de prática para o seu código wxPython para se sentir "limpa", mas é mais bonitos e muito mais poderoso do que Tkinter. Você também vai ficar melhor suporte, uma vez mais as pessoas usá-lo nos dias de hoje.
Que problemas você tem com pmw? É velho, sim, mas é pura python assim que deve funcionar.
Note que Tix não funciona com py2exe, se isso é um problema para você.