Canvas mit fester Breite

Fragen zu Tkinter.
Antworten
sommer87
User
Beiträge: 6
Registriert: Freitag 10. Juni 2011, 16:24

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
sommer87
User
Beiträge: 6
Registriert: Freitag 10. Juni 2011, 16:24

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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)
sommer87
User
Beiträge: 6
Registriert: Freitag 10. Juni 2011, 16:24

Hi,

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

Viele Grüße
sommer87
Antworten