Seite 1 von 1

Canvas mit fester Breite

Verfasst: Mittwoch 17. August 2011, 15:24
von sommer87
Hi,

ich habe ein Programm geschrieben, dass aus zwei Canvas besteht: eins links für eine Art Menu und eins rechts, in das dynamisch Daten geladen werden. Ich nutze dabei grid. Die Breite und Höhe des linken Canvas habe ich bereits über width und height angegeben. Beim Programmstart ist also alles super.
Wenn ich jetzt allerdings das Fenster vergrößere bzw. maximiere werden beide Canvas vergrößert und ich habe links im Menu jede Menge Freiraum, den ich für den dynamischen Bereich gut brauchen könnte. Gibt es da irgendeine Möglichkeit, dass ich einen Bereich festhalte?

Was ich bis jetzt hier und im Netz gefunden habe war irgendwie nie so das richtige für mein Problem. Würde mich freuen, wenn ihr eine Idee habt :)

Viele Grüße und schonmal danke,
sommer87

Re: Canvas mit fester Breite

Verfasst: Donnerstag 18. August 2011, 08:19
von wuf
Hi sommer87

Hier die Variante mit Pack:

Code: Alles auswählen

import sys
import Tkinter as tk

#~~ Lade den Dateiname dieses Skriptes
script_name = sys.argv[0]

#~~ Konstanten für die Abmessungen des Hauptfensters
MAIN_WIN_XPOS   = 10
MAIN_WIN_YPOS   = 10
MAIN_WIN_WIDTH  = 600
MAIN_WIN_HEIGHT = 320

#--- Erstelle ein Tk-Hauptfenster ----
app_win = tk.Tk()

app_win.geometry("%dx%d+%d+%d" % (MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT,
    MAIN_WIN_XPOS, MAIN_WIN_YPOS))
  
app_win['bg'] = 'khaki'
app_win.title(script_name)

canvas_01 = tk.Canvas(app_win, highlightthickness=0, width=200,
	bg='steelblue3')
canvas_01.pack(side='left', fill='y')

canvas_02 = tk.Canvas(app_win, highlightthickness=0, bg='khaki')
canvas_02.pack(side='left', fill='both')
app_win.mainloop()
Gruß wuf :wink:

Re: Canvas mit fester Breite

Verfasst: Donnerstag 18. August 2011, 09:12
von sommer87
Hi wuf,
vielen Dank für deine Antwort. :)
Gibt es da auch eine Möglichkeit das mit grid zu machen? Oder muss ich jetzt wegen diesem einen Wunsch alles in pack umschreiben?
Hab nur gelesen, dass man grid und pack nicht im selben Bereich verwenden soll.
Wenn es nur mit pack geht kann ich aber innerhalb des "gepackten" Canvas meine Frames etc. weiterhin mit grid anordnen oder?

Viele Grüße,
sommer87

Re: Canvas mit fester Breite

Verfasst: Donnerstag 18. August 2011, 13:20
von wuf
Hier die Grid-Variante:

Code: Alles auswählen

import sys
import Tkinter as tk

#~~ Lade den Dateiname dieses Skriptes
script_name = sys.argv[0]

#~~ Konstanten für die Abmessungen des Hauptfensters
MAIN_WIN_XPOS   = 10
MAIN_WIN_YPOS   = 10
MAIN_WIN_WIDTH  = 600
MAIN_WIN_HEIGHT = 320

#--- Erstelle ein Tk-Hauptfenster ----
app_win = tk.Tk()

app_win.geometry("%dx%d+%d+%d" % (MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT,
    MAIN_WIN_XPOS, MAIN_WIN_YPOS))
 
app_win['bg'] = 'khaki'
app_win.title(script_name)

canvas_01 = tk.Canvas(app_win, highlightthickness=0, width=200,
        bg='steelblue3')
canvas_01.grid(column=0, row=0, sticky='nsew')

canvas_02 = tk.Canvas(app_win, highlightthickness=0, bg='khaki4')
canvas_02.grid(column=1, row=0, sticky='nsew')

app_win.columnconfigure(0, weight=0)
app_win.columnconfigure(1, weight=1)
app_win.rowconfigure(0, weight=1)

app_win.mainloop()
Gruß wuf :wink:

Re: Canvas mit fester Breite

Verfasst: Donnerstag 18. August 2011, 13:23
von yipyip
Natuerlich geht das auch mit 'grid'.

Code: Alles auswählen

import Tkinter as tk


class Gui(object):

  def __init__(self, left_width=50, right_width=200, height=400, ratio=(1,9)):
    # 'ratio' gibt an, wie weit sich die beiden Canvases im Verhaeltnis zueinander
    # horziontal ausbreiten (mit den beiden Werten experimentieren!).
    self.root = tk.Tk()
    self.left_canvas = tk.Canvas(relief=tk.SUNKEN, width=left_width, height=height,
                                 bg='#444466', bd=2)
    self.right_canvas = tk.Canvas(relief=tk.SUNKEN, width=right_width, height=height,
                                  bg='#aaaabb', bd=2)

    # Canvases duerfen sich ausweiten
    stretch = tk.W + tk.E + tk.N + tk.S
    self.left_canvas.grid(row=0, column=0, sticky=stretch)
    self.right_canvas.grid(row=0, column=1, sticky=stretch)

    left_ratio, right_ratio = ratio
    # horizontal ausweiten 
    self.root.columnconfigure(0, weight=left_ratio)
    self.root.columnconfigure(1, weight=right_ratio)

    # vertikal ausweiten
    self.root.rowconfigure(0, weight=1)

        
  def run(self):

    self.root.mainloop()


if __name__ == '__main__':

  Gui().run()
Das linke Canvas ist in seiner Groesse nicht konstant. Beim Vergroessern des Fensters waechst es nur entsprechend langsamer als das rechte Canvas, je nach den beiden Werte des 'ratio' Parameters.
(Bei ratio=(1, 999) ist es so gut wie konstant :-) )
'grid' und 'pack' kann man immer indirekt mischen, also z.B. Widgets in einem Frame mit 'pack', dieses Frame dann mit 'grid' in einem anderen Frame usw..

:wink:
yipyip

(wuf war schneller)

Re: Canvas mit fester Breite

Verfasst: Donnerstag 18. August 2011, 22:44
von sommer87
Hi,

vielen Dank euch beiden für die schnelle Hilfe.
weight kannte ich noch nicht als Option. Funktioniert super :)

Viele Grüße
sommer87