2017-12-14 2 views
0

ich versuche, ein tkinter.Frame zu haben, die ein Vollbild haben und einige Tasten darunterTkinter rekursive Verhalten mit ‚<Configure>‘ Rückruf

WIDTH, HEIGHT = 800, 600 

root = Tk() 

mainframe = Frame(root, padding="3 3 12 12") 
mainframe.pack(fill=BOTH, expand=True) 

infovariable = StringVar() 
infovariable_label = Label(mainframe, textvariable=infovariable, anchor=S) 
infovariable_label.pack(fill=X, side=TOP) 

label = Label(mainframe) 
label.pack(fill=BOTH, expand=True) 

image_base = Image.open('hello.jpg') 

# setting the photo 
image = (image_base 
     .resize(2500, 1000) 
     .crop(0, 0, WIDTH,HEIGHT)) 

label.configure(image=photo) 

Wenn ich ein Fenster Resize tun, ich mein Foto mag gleich sein Abmessungen (Breite/Höhe), wenn ich, dass:

def onResize(event): 
    global WIDTH, HEIGHT 
    WIDTH = event.width 
    HEIGHT = max(0, event.height - 50) 

    # setting the photo 
    image = (image_base 
      .resize(2500, 1000) 
      .crop(0, 0, WIDTH,HEIGHT)) 

root.bind('<Configure>', onResize) 

die Größe ändern, um die Größe Bildänderung macht, dann wieder das Resize nennen, mit einem Fenster, das stufenlos ändert die Größe.

Ich habe das gleiche Problem wie dieses Thema:

odd behavior with '<Configure>' callback

Antwort

2

Wenn Sie in das Stamm Fenster binden, dass für jedes Kind des Wurzelfensters gilt verbindlich auch darauf zurückzuführen, wie tkinter Bindung Tags verwendet .

Teil der Lösung ist, ändern Sie Ihre onResize, um nur die Größe des Bildes zu ändern, wenn die event.widget das Stammfenster darstellt. Es kann andere Probleme geben, aber das ist die erste.

Sie müssen auch sicherstellen, dass Sie Grenzen berücksichtigen. Wenn Sie dem Bild die gleiche Größe des Fensters geben, aber die Beschriftung einen Rahmen mit einem Pixel hat, wird das Etikett wachsen, was dazu führt, dass das Stammfenster wächst, wodurch der Prozess von vorne beginnt.

Eine andere Antwort verwandte Tags zu binden, ist hier: https://stackoverflow.com/a/2472992/7432

+0

Ich würde die Grenze und die Hierarchie der gui (Anwendung Grenze und Polsterung zu jedem Kinder) nicht berechnen wollen. Gibt es keine Möglichkeit, ein Widget mit voller Breite zu erhalten, das ein Bild automatisch die Breite des Containers hat? –

+0

Die Hierarchie der Bindungen ist auch der Grund, warum Sie in einem Event-Handler manchmal 'return 'break" 'sehen. Die Zeichenfolge "break" bricht aus der Bindungshierarchie aus. – Gary02127

+0

@RobertVandenEynde: nein. Tkinter-Bilder funktionieren nicht so. Sie müssen das tun, was Sie tun - Änderungen in der Größe des Widgets erkennen, die richtige Größe berechnen und dann die Größe des Bildes erzwingen. –

Verwandte Themen