2012-12-18 7 views
6

Próbuję zbudować podstawowy GUI za pomocą ttk/Tkinter.Python i ttk Używanie labelFrames do czyszczenia ramki

mam wykreślane podstawową GUI, który ma prawo podstawowe składniki, ale gdy próbuję i upiększać go/ją przestrzeń, mam osiągnąć mój limit coraz pojemników TTK grać ładnie ...

Przykłady:

from Tkinter import * 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title("Text Comparitor") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 
     self.mainframe.pack() 
     ## text labels 
     ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E) 
     self.mainframe.pack(side="bottom", fill=BOTH, expand=True) 
     self.mainframe.grid() 
     ttk.Label(self.mainframe, text="Source Filename:").grid(column=1, row=2, sticky=W) 
     ttk.Label(self.mainframe, text="Source Text:").grid(column=1, row=3, sticky=W) 
     ttk.Label(self.mainframe, text="Converted Text:").grid(column=1, row=4, sticky=W) 
     ttk.Label(self.mainframe, text="Cleaned Source:").grid(column=1, row=5, sticky=W) 
     ttk.Label(self.mainframe, text="Cleaned Converted:").grid(column=1, row=6, sticky=W) 
     ttk.Label(self.mainframe, text="Details:").grid(column=1, row=7, sticky=W) 
     ## buttons 
     self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE) 
     self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S) 
     self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW) 

    def closeFrame(self): 
     self.root.destroy() 

    def nextPara(self): 
     pass 

    def prevPara(self): 
     pass 

def main(): 
    root = Tk() 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

skutkiem czego jest: http://imgur.com/a/CwpCU#0

Próbowałem dodać 2nd obiekt kontenera, ramkę etykiet do przechowywania przedmiotów etykietę tekstową, co powoduje przycisków Poruszając się dalej w górę (więc zakładam, że nie odwołuję się do labelf Rame do prawidłowo siatki:

from Tkinter import * 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title("Text Comparitor") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 
     self.mainframe.pack() 
     ## text labels 
     ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E) 
     self.lfdata = ttk.Labelframe(self.root, labelwidget=self.mainframe, text='Label')# 
     self.lfdata.grid() 
     ttk.Label(self.lfdata, text="Source Filename:").grid(column=1, row=2, sticky=W) 
     ttk.Label(self.lfdata, text="Source Text:").grid(column=1, row=3, sticky=W) 
     ttk.Label(self.lfdata, text="Converted Text:").grid(column=1, row=4, sticky=W) 
     ttk.Label(self.lfdata, text="Cleaned Source:").grid(column=1, row=5, sticky=W) 
     ttk.Label(self.lfdata, text="Cleaned Converted:").grid(column=1, row=6, sticky=W) 
     ttk.Label(self.lfdata, text="Details:").grid(column=1, row=7, sticky=W) 

     ## buttons 
     self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE) 
     self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S) 
     self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW) 

    def closeFrame(self): 
     self.root.destroy() 

    def nextPara(self): 
     pass 

    def prevPara(self): 
     pass 

def main(): 
    root = Tk() 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

co skutkuje: http://imgur.com/a/CwpCU#1 Uwaga swapu stanowisk między przyciskami etykiet abd, a po prostu o widocznych aspektach labelframe.

Staram się, aby druga wersja wyglądała jak ładniejsza wersja 1-sza.

Wszelkie wskazówki - czytałem różne zasoby/dokumenty i nie mogę znaleźć niczego, co pasowałoby do mojego przykładu (najprawdopodobniej - robię coś głupiego ...) i nic, co próbowałem nie ma pracował jeszcze - w tym pack(), grid() i inne fragmenty, które znalazłem w innych pokrewnych przykładach.

+0

lepiej nie korzystać z sieci i spakować w jednym oknie. Wolę siatkę. Myślę też, że zmienne przycisku (z domyślną siatką) nie przechowują tego, czego oczekujesz. Siatka nie zwraca odniesienia do obiektu, o ile pamiętam. – Gonzo

+0

Widgety @Phelix _Tkinter_ mogą korzystać z różnych menedżerów geometrii w tym samym oknie **, o ile nie mają tego samego rodzica **. _pack_ może dokonać pewnych rzeczy z mniejszym kodem; więc nie polecam używania tylko _grid_. –

Odpowiedz

10

Istnieje wiele miejsc, które wymagają korekt, pozwól nam je skomentować (prawdopodobnie o czymś zapomnę, więc koniecznie sprawdź kod na dole).

Po pierwsze, stosowanie wag do kolumn/rzędów w samej ramce nie spowoduje jej rozwinięcia podczas zmiany rozmiaru okna. Musisz to zrobić w root. Następnie możesz zrobić to w ramce, aby dopasować swoje oczekiwania dotyczące układu po zmianie rozmiaru. W twoim przypadku najbardziej sensowne jest to, że każda kolumna ma taki sam ciężar> 0, a tylko drugi wiersz ma wagę> 0. Argumentacja kolumn jest taka, że ​​masz 3 przyciski, i chcesz, aby wszystkie się rozszerzyły. wolna przestrzeń w ten sam sposób. W przypadku drugiej części jest to bezpośrednia obserwacja, biorąc pod uwagę, że w drugim rzędzie znajduje się Labelframe. Podanie wagi> 0 dla każdego innego rzędu da ci bardzo dziwny układ. Problemy z wagą.

Następną rzeczą, którą zaobserwowałem, była Twoja najlepsza etykieta z większą czcionką. Na pewno chcesz, aby obejmował on 3 kolumny (znowu ta liczba 3 jest związana z rzędem przycisków, które utworzysz w późniejszym czasie). Możesz również chcieć, aby tekst był wycentrowany w tych 3 kolumnach (nie jestem tu pewien twoich preferencji).

Teraz możesz utworzyć Labelframe. To po prostu nie w porządku, opcja labelwidget nie oznacza tego, co myślisz. Określa widżet Label, który ma służyć jako etykieta dla tej ramki etykiety. Dlatego określenie głównej ramki dla tego parametru nie ma sensu. Być może chcesz, aby jakiś tekst był widoczny w określonej pozycji w ramce etykiety. Również ta ramka z etykietami musi być również pokryta rozpiętością słupów równą 3.

Generalnie dla "siatki" zalecam podanie opcji in_, aby było jasne, w jakim widżecie jesteś "siatką". Dzięki temu staje się oczywiste, że zaczynasz od column=0, row=0 za każdym razem, gdy pogłębiasz poziom rodzicielstwa widżetów.

Oto jak dostosować swój kod:

import Tkinter 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title(u"Title") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding=(6, 6, 12, 12)) 
     self.mainframe.grid(sticky='nwse') 
     for column in range(3): 
      self.mainframe.columnconfigure(column, weight=1) 
     self.mainframe.rowconfigure(1, weight=1) 

     ## text labels 
     ttk.Label(self.mainframe, text=u"Label Title", anchor='center', 
       font=("Helvetica", 32)).grid(in_=self.mainframe, 
         column=0, row=0, columnspan=3, sticky="ew") 

     self.lfdata = ttk.Labelframe(self.mainframe, padding=(6, 6, 12, 12), 
       text='Labelframe') 
     self.lfdata.grid(column=0, columnspan=3, row=1, sticky='nsew') 
     info = (u"Source Filename", u"Source Text", u"Converted Text", 
       u"Cleaned Source", u"Cleaned Converted", u"Details") 
     for i, item in enumerate(info): 
      ttk.Label(self.lfdata, text=u"%s:" % item).grid(in_=self.lfdata, 
        column=0, row=i, sticky='w') 

     ## buttons 
     btn = (u"Close", u"Next", u"Prev") 
     for i, item in enumerate(btn): 
      ttk.Button(self.mainframe, text=item).grid(in_=self.mainframe, 
        column=i, row=3) 

def main(): 
    root = Tkinter.Tk() 
    root.columnconfigure(0, weight=1) 
    root.rowconfigure(0, weight=1) 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Oto jak to wygląda podczas uruchamiania programu i po pewnym zmiany rozmiaru:

enter image description hereenter image description here

+1

Wow. Dziękuję bardzo za to. Wkurzyłem się i odkryłem kilka moich błędów, ale naprawdę pomogłeś mi lepiej zrozumieć, jak to działa. Naprawdę doceniam twój czas. –