2008-11-12 3 views
12

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

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

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

ответ

15

На недавнем 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') 

Для получения дополнительной информации, проверить этот webpage на сайте ФСФ.

Отметьте, что tix довольно старый и не очень хорошо поддерживается, поэтому лучше всего выбрать ttk.Notebook.

+0

К сожалению, я получаю сообщение об ошибке, когда пытаюсь использовать класс Tix.NoteBook в своем окне Windows. Это похоже на путь, если я когда-либо решаю использовать Tkinter для чего-то крупного, но попытка скомпилировать все из источника будет запретительной для небольшого проекта. – 2008-11-12 22:17:51

+1

Сообщите нам об ошибке, и мы сможем помочь с руководством. – tzot 2008-11-13 00:28:21

+0

На самом деле я сам это понял; количество ресурсов Python Tix в Интернете очень тяжело, и я, вероятно, опубликую вопрос о переполнении стека об этом, если ничего другого. Еще раз спасибо за предложение использовать Tix. – 2008-11-13 15:43:33

0

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

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

+4

«Много приятнее», безусловно, субъективно. С последними версиями Tkinter, которые включают тематические виджеты, Tkinter выглядит так же современно, как и любой другой кросс-платформенный инструментарий. – 2009-05-18 20:09:42

0

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

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

3

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

5

Если кто-то все еще ищет, у меня это работает как 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() 
Смежные вопросы