2008-11-12 19 views
12

Nachdem ich etwas mit Tkinter und wxPython gespielt habe, mag ich Tkinter viel besser in Bezug darauf, wie sauber mein Quellcode aussieht. Es scheint jedoch nicht so viele Funktionen zu geben. insbesondere hat es keine Tabs (wie in den Tabs oben in einem Firefox-Fenster).Notebook-Widget in Tkinter

Ein wenig googeln zu diesem Thema bietet ein paar Vorschläge. Es gibt a cookbook entry mit einer Klasse, die es Ihnen erlaubt, Registerkarten zu verwenden, aber es ist sehr primitiv. Es gibt auch Python megawidgets auf SourceForge, obwohl dies sehr alt scheint und mir während der Installation Fehler gab.

Hat jemand Erfahrung im Erstellen von Registerkarten in Tkinter? Was hast du benutzt? Oder ist es einfach so, dass jemand, der leistungsfähigere Fensterkomponenten benötigt, wxPython verwenden muss?

Antwort

15

Auf den letzten Python (> 2.7) Versionen, können Sie das ttk Modul verwenden, die den Zugang zum Tk Themen Widget Set bietet, die in Tk 8.5 eingeführt wurde.

Hier ist, wie Sie ttk in Python importieren 2:

import ttk 

help(ttk.Notebook) 

In Python 3, das ttk Modul mit den Standarddistributionen als Submodul von tkinter kommt.

Hier ist ein einfaches Ausführungsbeispiel basiert auf einem Beispiel aus der TkDocs Website:

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() 

Eine weitere Alternative ist das NoteBook Widget aus der tkinter.tix Bibliothek zu verwenden. Um tkinter.tix zu verwenden, müssen Sie die Widgets Tix installiert haben, normalerweise neben Ihrer Installation der Widgets Tk. Um die Installation zu testen, versuchen Sie folgendes:

from tkinter import tix 
root = tix.Tk() 
root.tk.eval('package require Tix') 

Für weitere Informationen, lesen Sie in diesem webpage auf der PSF-Website.

Beachten Sie, dass tix ist ziemlich alt und nicht gut unterstützt, so dass Ihre beste Wahl für ttk.Notebook gehen könnte.

+0

Leider erhalte ich einen Fehler, wenn ich versuche, die Tix.NoteBook-Klasse in meiner Windows-Box zu verwenden. Das sieht nach dem Weg aus, wenn ich mich entscheide, Tkinter für etwas Wichtigeres zu verwenden, aber die Mühe, alles aus der Quelle zu kompilieren, wäre für ein kleines Projekt unerschwinglich. –

+1

Sagen Sie uns den Fehler und wir können Ihnen bei der Anleitung helfen. – tzot

+0

Eigentlich habe ich es selbst herausgefunden; Die Anzahl der Online-Python-Tix-Ressourcen ist erschreckend niedrig und ich werde wahrscheinlich eine Stack-Overflow-Frage dazu stellen, wenn nichts anderes. Nochmals vielen Dank für den Vorschlag, Tix zu verwenden. –

0

"Oder ist es einfach so, dass jeder, der leistungsfähigere Fensterkomponenten benötigt, wxPython verwenden muss?"
Kurze Antwort: ja.

Lange Antwort: Es kann etwas Übung für Ihren wxPython-Code zu fühlen "sauber", aber es ist schöner und viel mächtiger als Tkinter. Sie werden auch besser unterstützt, da heutzutage mehr Leute es benutzen.

+4

"Viel schöner" ist definitiv subjektiv. Mit den neuesten Versionen von Tkinter, die die thematischen Widgets enthalten, sieht Tkinter so modern aus wie jedes andere plattformübergreifende Toolkit. –

0

Welche Probleme hatten Sie mit PMW? Es ist alt, ja, aber es ist pure Python, also sollte es funktionieren.

Beachten Sie, dass Tix nicht mit py2exe funktioniert, wenn das ein Problem für Sie ist.

+0

Mein Problem war, dass das setup.py-Skript nicht funktionierte. Ich habe es später installiert, indem ich einfach das Pmw-Verzeichnis in Site-Pakete kopiert habe. Aber diese Art von Fehler in Kombination mit der Oldness des Pakets lässt mich zögern, es zu verwenden. Zumindest wxPython ist aktuell, obwohl ich Tkinter immer noch besser mag. –

3

Während es Ihnen im Moment nicht helfen kann, kommt tk 8.5 mit einem erweiterten Satz von Widgets. Dieser erweiterte Satz ist mit tk 8.4 über eine Erweiterung verfügbar, die als "Kachel" bekannt ist. Zu den erweiterten Widgets gehört ein Notizbuch-Widget. Leider verwendet Tkinter zu diesem Zeitpunkt standardmäßig eine ziemlich alte Version von Tk, die nicht mit diesen Widgets ausgeliefert wird.

Es gab Bemühungen, Kachel für Tkinter verfügbar zu machen. Schauen Sie sich http://tkinter.unpythonic.net/wiki/TileWrapper an. Für einen anderen ähnlichen Aufwand siehe http://pypi.python.org/pypi/pyttk. Um einen Eindruck davon zu bekommen, wie diese Widgets aussehen (in Ruby, Perl und Tcl), siehe http://www.tkdocs.com/.

Tk 8.5 ist eine riesigen Verbesserung gegenüber Lagern Tk. Es führt mehrere neue Widgets, native Widgets und eine Theming-Engine ein. Hoffentlich wird es in Tkinter in Kürze verfügbar sein. Schade, dass die Python-Welt anderen Sprachen hinterherhinkt.

update: Die neuesten Versionen von Python enthalten jetzt die Unterstützung für die themenbezogenen Widgets, die sofort einsatzbereit sind. _

+0

Süß! Ich werde das auf jeden Fall überprüfen. Danke, und ich stimme definitiv zu, dass Python bei GUI-Sachen hinter anderen Sprachen zurückbleibt. Ich schätze, das Problem ist, dass es so oft für Web-Programmierung und andere Server/Scripting-Software verwendet wird, dass die GUI nur für die meisten Entwickler keine Priorität hat. –

5

Wenn jemand immer noch sucht, habe ich das funktioniert als Tab in tkinter. Spielen Sie mit dem Code herum, damit er so funktioniert, wie Sie möchten (z. B. können Sie eine Schaltfläche hinzufügen, um eine neue Registerkarte hinzuzufügen):

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() 
+5

moderne Versionen von tkinter kommen mit dem 'ttk'-Paket, das ein natives Tab-Widget hat. Es gibt keinen Grund mehr, sich ein eigenes zu bauen. Siehe http://www.tkdocs.com/tutorial/complex.html#notebook –

+2

Ohh, ich hätte mehr darüber nachdenken sollen. Ich musste Tkinter für die Verteilung verwenden und dachte nicht, Tab war ein Teil davon. Ohh, es hat Spaß gemacht, es selbst zu machen, aber ich schätze, ich werde am Ende mit dem ttk-Paket arbeiten, um besseren Support zu bekommen: P. Danke für die Köpfe hoch! – sPaz