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?

Foi útil?

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ê.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top