Seite 1 von 1

Tkinter Fensterinhalt mit Fenstergröße skalieren

Verfasst: Montag 16. Februar 2009, 17:27
von iceman21
Hallo ich suche nach einer Möglichkeit meine gezeichneten Kreise und linien (Spielbrett) dynamisch su verändern. Wenn ich das Fenster an der Ecke größer ziehe, soll auch der Inhalt entsprechend größer werden. Dazu müsste ich das Event des Ziehens abfangen und dann einmal nachfragen wie groß es jetzt ist. Wisst ihr wie das geht?

MfG

Re: Tkinter Fensterinhalt mit Fenstergröße skalieren

Verfasst: Montag 16. Februar 2009, 18:07
von numerix
iceman21 hat geschrieben:Hallo ich suche nach einer Möglichkeit meine gezeichneten Kreise und linien (Spielbrett) dynamisch su verändern. Wenn ich das Fenster an der Ecke größer ziehe, soll auch der Inhalt entsprechend größer werden. Dazu müsste ich das Event des Ziehens abfangen und dann einmal nachfragen wie groß es jetzt ist. Wisst ihr wie das geht?
Du ermittelst die Größe des Canvas über die Methoden winfo_width() und winfo_height(), das Event, das beim Verändern der Fenstergröße ausgelöst wird, heißt "<Configure>", und die Canvas-Methode scale() kennst du wahrscheinlich.

Verfasst: Dienstag 17. Februar 2009, 18:08
von wuf
Hallo iceman21

Hier ein kleines 'Kick Off' Beispiel:

Code: Alles auswählen

# Skriptname: scaleable_canvas_obj_01.py

import Tkinter as tk

def update_graph_obj(event):
    """Skaliere Grafik-Objekte"""

    canvas_obj = event.widget
    new_canvas_width = canvas_obj.winfo_width()
    new_canvas_height = canvas_obj.winfo_height()
    xscale_fac = float(new_canvas_width) / float(canvas_obj.width)
    yscale_fac = float(new_canvas_height) / float(canvas_obj.height)
    canvas_obj.width, canvas_obj.height = (new_canvas_width, new_canvas_height)

    canvas_obj.scale('graph_obj', 0, 0, xscale_fac, yscale_fac)

def main():

    #~~ Erstelle Hauptfenster
    app_win = tk.Tk()

    xpos = 20
    ypos = 20
    width = 200
    height = 200

    #~~ Erstelle die Canvas-Flaeche
    canvas = tk.Canvas(app_win, bd=0, highlightthickness=0, width=width,
        height=height, bg='steelblue')
    canvas.pack(side='left', fill='both', expand='yes')
    canvas.bind('<Configure>', update_graph_obj)

    canvas.width = width
    canvas.height = height

    #~~ Erstelle vier Grafik-Objekte (Rechtecke)
    for obj_nr in xrange(4):
        offset = obj_nr * 10
        canvas.create_rectangle(xpos+offset, ypos+offset, 100+offset,
            100+offset, fill='yellow', tags='graph_obj')

    #~~ Erstelle ein Kreis-Objekt
    x = 90
    y = 90
    rad = 30
    canvas.create_oval(x-rad, y-rad, x+rad, y+rad, stipple='gray50',
        width=0, fill='red', tags='graph_obj')

    app_win.mainloop()

main()
Gruss wuf :wink: