2012-03-23 12 views
5

Próbuję stworzyć prosty procesor tekstu dla początkujących, aby nieco lepiej nauczyć się Pythona.Jak zatrzymać zmianę rozmiaru widgetu Tkinter Text przy zmianie czcionki?

Używam widżet Tkinter Text dla głównego programu do edycji, jedynym problemem jest wysokość i szerokość są zdefiniowane przez bohaterów.

Powoduje to problem podczas zmiany czcionek, ponieważ nie wszystkie czcionki mają tę samą szerokość.

Za każdym razem, gdy zmienia się czcionka, widżet Tekst ponownie zmienia rozmiar, chociaż technicznie ma tę samą szerokość i wysokość. To wygląda śmiesznie, gdy próbuję coś napisać, staram się, aby edytor tekstu był jak najbardziej niezawodny.

Czy istnieje sposób definiowania szerokości i wysokości w pikselach?

the .grid_propagate(False) nie jest przydatny, ponieważ rozmiar nie zmienia się technicznie, tylko szerokość znaku.

Na razie próbuję trzymać się z dala od wxPython, ponieważ wszystko, co zrobiłem do tej pory, było w Tkinter.

Zrobiłem nieskończone godziny obszernego wyszukiwania, ale nie znalazłem żadnych rozwiązań.

Odpowiedz

9

Mylisz się, gdy mówisz, że nie możesz użyć grid_propagate(False), ponieważ możesz. grid_propagate jest powiązany z rzeczywistym rzeczywistym rozmiarem, a nie o rozmiarze o atrybucie. Ponadto, jeśli po prostu podasz aplikacji określony rozmiar przy użyciu wm_geometry, zmiany czcionki nie wpłyną na rozmiar okna.

Oto przykład przy użyciu grid_propagate określający pojemnik na stałą wielkość w pikselach:

import Tkinter as tk 
import tkFont 

class SampleApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self._textFont = tkFont.Font(name="TextFont") 
     self._textFont.configure(**tkFont.nametofont("TkDefaultFont").configure()) 

     toolbar = tk.Frame(self, borderwidth=0) 
     container = tk.Frame(self, borderwidth=1, relief="sunken", 
          width=600, height=600) 
     container.grid_propagate(False) 
     toolbar.pack(side="top", fill="x") 
     container.pack(side="bottom", fill="both", expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 
     text = tk.Text(container, font="TextFont") 
     text.grid(row=0, column=0, sticky="nsew") 

     zoomin = tk.Button(toolbar, text="+", command=self.zoom_in) 
     zoomout = tk.Button(toolbar, text="-", command=self.zoom_out) 
     zoomin.pack(side="left") 
     zoomout.pack(side="left") 

     text.insert("end", '''Press te + and - buttons to increase or decrease the font size''') 

    def zoom_in(self): 
     font = tkFont.nametofont("TextFont") 
     size = font.actual()["size"]+2 
     font.configure(size=size) 

    def zoom_out(self): 
     font = tkFont.nametofont("TextFont") 
     size = font.actual()["size"]-2 
     font.configure(size=max(size, 8)) 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
+0

ja odnoszę się do grid_propagate nie pracuje z widgetu tekstowego. Technicznie działa, ale nadal się rozwija, ponieważ jego szerokość jest w postaciach, a więc pozostaje taka sama w postaciach, ale nie wszystkie wielkości postaci są takie same. Widżet tekstowy nie wypełnia całego okna, chciałem, aby było miejsce na dodanie przycisków później. Problem polega na tym, że widżet "Tekst" zmienia rozmiar, aby spełnić wymagania każdej czcionki. Wygląda to głupio, kiedy coś piszesz i zmieniasz czcionkę oraz widzisz rozszerzenie i kontraktowanie widżetu. – reallycoolnerd

+0

@reallycoolnerd: Przykro mi, ale błędnie mówisz o 'grid_propagate'. Nie ma to nic wspólnego z atrybutem size, ma to związek z rzeczywistym rozmiarem widgetu. Jeśli możesz pokazać kod, w którym próbujesz użyć 'grid_propagate' i to nie działa, możemy to naprawić. Wygląda na to, że nie rozumiesz, w jaki sposób działa 'grid_propagate'. Zdajesz sobie sprawę, że musisz zadzwonić do rodzica? Nie ma efektu wywoływania 'grid_propagate' na samym widgecie tekstowym. –

+0

@reallycoolnerd: czy coś w tym przykładzie jest dla ciebie mylące? Przykład wyraźnie pokazuje, w jaki sposób mogę ustawić rozmiar widgetu tekstowego w pikselach, ustawiając rozmiar jego kontenera i wyłączając propagację geometrii. Być może, jeśli potrafisz wyjaśnić, dlaczego nie rozumiesz tego przykładu, mogę wymyślić, jak to poprawić. –