Problem mit Tkinter Grid Geometry Manager

Fragen zu Tkinter.
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

ich habe ein Problem mit der Anordnung meiner Tkinter Widgets (Label, Button, Text).
Ich habe das mit dem Grid Geometry Manager versucht.
Aber ich bekomme die Anordnung der einzelnen Elementen nicht so hin wie ich es haben möchte.
Die Abständen zwischen den einzelnen Elementen ist mir zu groß.
Wie kann ich das ändern ?
Ist das mit "Grid" zu machen oder muss ich etwas anderes nehmen.
Das Ziel ist:
1. die Anordnung so zu gestalten wie im Beispiel-Bild "sz2.gif"
2. Wenn das Fenster maximiert wird soll die Anordnung der Elemente mit wandern (d.h. der Button "Service" soll unten rechts bleiben).

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 30 12:44:05 2017

@author: Juergen
"""

"""
ZetCode Tkinter tutorial

In this script, we use the grid
manager to create a more complicated
layout.

Author: Jan Bodnar
Last modified: December 2015
Website: http://www.zetcode.com
"""
# Beispiel von:
# http://zetcode.com/gui/tkinter/layout/


import tkinter as tk
from tkinter.ttk import Frame, Button, Label, Style


class Example(tk.Frame):
  
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)   
         
        self.parent = parent
        self.initUI()
        self.style = Style()
        self.style.theme_use("default")
        
    def initUI(self):
      
        self.parent.title("Steuerzentrale")
        self.pack(fill='both', expand=True)
        
        
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)
        self.columnconfigure(3,  weight=1)          
        self.columnconfigure(4, weight=1)
        self.rowconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)
        self.rowconfigure(2, weight=1)
        self.rowconfigure(3, weight=1)
        self.rowconfigure(4, weight=1)
        self.rowconfigure(5,  weight=1)             
        self.rowconfigure(6, weight=1)
        
        
        self.var = tk.IntVar()
        self.var.set(1)                     # Default Alarmzone A
        
        text_label1 = tk.Label(self, font = 12,text="Alarmzone", width=20)
        text_label1.grid(row=0, column=0, sticky='n', padx=5, pady=5)
        
        #area = tk.Text(self)
        #area.grid(row=2, column=1, columnspan=1, rowspan=1, 
        #    padx=5, sticky='e'+'w'+'s'+'n')
        
        # RadioButton
        radiobutton_1 = tk.Radiobutton(self, text="A", font = 12, variable=self.var, value= 1, command=self.sel)
        radiobutton_1.grid(row=1, column=0)
        radiobutton_2 = tk.Radiobutton(self, text="B", font = 12, variable=self.var, value= 2, command=self.sel)
        radiobutton_2.grid(row=1, column=1)
        radiobutton_3 = tk.Radiobutton(self, text="C", font = 12, variable=self.var, value= 3, command=self.sel)
        radiobutton_3.grid(row=1, column=2)
        radiobutton_4 = tk.Radiobutton(self, text="D", font = 12, variable=self.var, value= 4, command=self.sel)
        radiobutton_4.grid(row=1, column=3)
        
        text = tk.Text(self, height=5, width=30)
        text.grid(row=2, column=1)     
        
        
        alarm_on = tk.Button(self, text="Alarm aktivieren", width=20)
        alarm_on.grid(row=1, column=4)
        
        alarm_status = tk.Label(self, text="Alarm inaktiv", width=20)
        alarm_status.grid(row=2,column=4)

        feueralarm = tk.Button(self, text="Feueralarm", width=20)
        feueralarm.grid(row=3, column=4, pady=5)
        
        medical = tk.Button(self, text="Medical", width=20)
        medical.grid(row=4, column=4)
        
        panik = tk.Button(self, text="Panik", width=20)
        panik.grid(row=5, column=4)
        
        service = tk.Button(self, text="Service", width=20)
        service.grid(row=6, column=4, padx=0)

        close = tk.Button(self, text="Close", command=self.quit, width=15)
        close.grid(row=6, column=0)        
              
               
        text.insert('end', "Alarmtext_1\nAlarmtext_2\n")
        
    def sel(self):
        selection = tk.StringVar()
        if self.var.get() == 1:
               selection = "A"
        elif self.var.get() == 2:
                selection = "B"
        elif self.var.get() == 3:
                selection = "C"
        else:
                 selection = "D" 
        
        text_label2 = tk.Label(self, font = 12, text = selection)
        text_label2.grid(row=0, column=0, padx= 50) 

def main():
  
    root = tk.Tk()
    # geometry(X*Y+Offset)
    root.geometry("800x450+100+100")
    tk.app = Example(root)
    root.mainloop()  


if __name__ == '__main__':
    main()  
Bild "sz2.gif": Sorry ich weiss im Moment nicht wie ich das Bild hier zeigen kann.

MfG
Juergen B.
:?:
beertonic
User
Beiträge: 37
Registriert: Montag 8. Mai 2017, 15:26

Lass den Teil weg:

Code: Alles auswählen

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)
        self.columnconfigure(3,  weight=1)          
        self.columnconfigure(4, weight=1)
        self.rowconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)
        self.rowconfigure(2, weight=1)
        self.rowconfigure(3, weight=1)
        self.rowconfigure(4, weight=1)
        self.rowconfigure(5,  weight=1)            
        self.rowconfigure(6, weight=1)
      
und lege eine minimal Größe für das Fenster fest.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@jbaben: bei columconfigure und rowconfigure bringt Dir weight so ziemlich gar nichts.

Aber probiere es doch mal mit: minsize
Außderdem auch besonders wichtig bei grid sind dann die parameter: columnspan rowspan sticky

Schau Dir vielleicht einmal meinen GuiDesiger an auf github an: https://github.com/AlfonsMittelmeyer/py ... -messaging

Damit Du eine Vosrstellung von den tkinter Möglichkeiten bekommst:

Im Folgenden ist ein Ausschnitt aus dem Grid Design eines Fensters der Einführung. An den Rändern graue Balken bedeuten eine Einstellung für die ganze grid Table. Orange sind davon absweichende individuelle Einstellungen pro Spalte oder Reihe - einfach per Mausdreh änderbar. Hellblau mit schwarzen Rändern sind die sichtbar gemachten Zellen der Tabelle, die man wieder unsichtbar machen kann.

Naja, für das Photoimage hätte eine Zeile gereicht statt 6 Zeilen und dafür rowspan 6.

Bild
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

beertonic danke für den Hinweis, aber wenn ich die genannten Zeilen (43-54) weglasse sind die Abstände zwischen den vertikalen Button's ok, das Gesamtbild sieht aber noch nicht so aus wie ich mir das vorstelle (z.B. die Abstände bei den Radiobuttons) und wenn ich das Fenster maximiere wandern die Elemente nicht mit (Button "Service" nicht unten rechts).

MfG

Juergen B.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@jbaben: ich habe mal Dein Script in meinen GuiDesigner geladen. Das Problem ist, Du hast kein columnspan benutzt. rowspan wäre ebenso angebracht.

Dein Design (mit meinen Standardeinstellungen row minsize 25 und column minsize 75):

Bild

Also, ich mache es so: wenn ich es nicht genau weiß, mache ich zuerst ein pane layout, lege eine grid tabelle an und schaue, wie das pane laypout da hineinpaßt und verschiebe dann die widgets in das grid layout mit Einstellung von rowspan und columnspan, wo erforderlich.

PS: Wenn Du ein panelayout lieferst, kann ich das gridlayout dazu machen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@jhaben: Wäre das ein Vorschlag?

Bild
Für die Buttons rechts habe ich keine Breite genommen, stattdessen mit sticky = "news" auf die ganze Breite der Zellen eingestellt. Die Zellen passen sich dem breitesten Element an. Zusätzlich habe ich bei grid einen Abstand zur Zelle eingestellt mit padx und pady.

PS: Wenn man das anschaut, sieht man, daß man das mit columncofigure und rowconfigue egentlich nicht braucht. Die Breite richtet sich ja nach A,B,C,D und wenn Du die entsprechend breit machst, etwa durch padx, hättest Du auch die gewünschte Breite.

Also, die Lösung liegt nicht bei rowconfigure und columnconfigure, sondern daß man rowspan und columnspan für die breiteren und höheren Elemente benutzt, sodaß sie über mehrere Spalten oder Zeilen gehen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jbaben

Hier ein Prototyp-Skript bei welchem nur der 'pack' Layout Manager zum Einsatz kommt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
    import tkFont as fnt
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk
    import tkinter.font as fnt

APP_TITLE = "Alarm Panel"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 800
APP_HEIGHT = 450

MAIN_LABEL_NAME = "Alarmzone"
MAIN_LABEL_FONT = ('Helvetica', 16, 'bold')
MAIN_LABEL_COLOR = 'blue'
ALARM_LABEL_OFF = "Alarm inaktiv"
ALARM_LABEL_ON = "Alarm aktiv"
RADIO_BUTTONS = ["A", "B", "C", "D"]
COMMAND_BUTTONS = ["Feueralarm", "Medical", "Panik", "Service"]
BUTTON_ALARM_OFF = "Alarm aktivieren"
BUTTON_ALARM_ON = "Alarm rückstellen"
BUTTON_CLOSE = "Beenden"

COMMAND_BUTTON_WIDTH = 20


class Application(tk.Frame):

    def __init__(self, master):
        self.master = master
        self.master.protocol("WM_DELETE_WINDOW", self.close)
        tk.Frame.__init__(self, master)

        self.radio_buttons = list()
        self.command_buttons = list()
        
        self.label_frame = tk.Frame(self)
        self.label_frame.pack(fill='x')
        
        self.command_frame = tk.Frame(self)
        self.command_frame.pack(fill='both', expand=True)
        
        self.command_frame_left = tk.Frame(self.command_frame)
        self.command_frame_left.pack(side='left', fill='both', expand=True)

        self.command_frame_right = tk.Frame(self.command_frame)
        self.command_frame_right.pack(side='left', fill='both', expand=True)

        self.radiobutton_frame = tk.Frame(self.command_frame_left)
        self.radiobutton_frame.pack(fill='x')
        
        tk.Label(self.label_frame, font=MAIN_LABEL_FONT, text=MAIN_LABEL_NAME,
            fg=MAIN_LABEL_COLOR, width=20, anchor='w').pack(side='left',
                fill='x', padx=5, pady=5)
        
        self.var = tk.IntVar()
        self.var.set(0)
        for index, radiobutton_name in enumerate(RADIO_BUTTONS):
            radio_button = tk.Radiobutton(self.radiobutton_frame, font=16,
                text=radiobutton_name,command=partial(self.radiobutton_callback,
                index, radiobutton_name), variable=self.var, anchor='w',
                value=index)
            radio_button.pack(side='left', fill='x', expand=True)
            self.radio_buttons.append(radio_button)
        
        self.alarm_label_var = tk.StringVar()
        self.alarm_label = tk.Label(self.command_frame_right, width=20,
            font=MAIN_LABEL_FONT, textvariable=self.alarm_label_var)
        self.alarm_label.pack()
        self.alarm_label_var.set(ALARM_LABEL_OFF)     

        self.alarm_aktive = False
        self.alarm_button_var = tk.StringVar()
        self.alarm_button = tk.Button(self.command_frame_right, 
            textvariable=self.alarm_button_var,
            command=self.alarm_button_callback)
        self.alarm_button.pack(expand=True)
        self.alarm_button_var.set(BUTTON_ALARM_OFF)

        self.command_button_frame = tk.Frame(self.command_frame_right)
        self.command_button_frame.pack(expand=True)
            
        for index, button_name in enumerate(COMMAND_BUTTONS):
            command_button = tk.Button(self.command_button_frame,
                text=button_name, command=partial(self.command_button_callback,
                index, button_name), width=COMMAND_BUTTON_WIDTH)
            command_button.pack()
            self.command_buttons.append(command_button)

        tk.Button(self.command_frame_right, text=BUTTON_CLOSE,
            command=self.close).pack(side='bottom')
            
        self.text = tk.Text(self.command_frame_left)
        self.text.pack(fill='both', expand=True)   
        self.text.insert('end', "Alarmtext_1\nAlarmtext_2\n")
        
    def radiobutton_callback(self, index, name):
        print("Radiobutton:", index, name)
    
    def command_button_callback(self, index, name):
        print("Commandbutton:", index, name)
    
    def alarm_button_callback(self):
        print("Alarm aktivieren")
        if not self.alarm_aktive:
            self.alarm_aktive = True
            self.alarm_label_var.set(ALARM_LABEL_ON)
            self.alarm_label.config(fg='red')
            self.alarm_button_var.set(BUTTON_ALARM_ON)
        else:
            self.alarm_aktive = False
            self.alarm_label_var.set(ALARM_LABEL_OFF)            
            self.alarm_button_var.set(BUTTON_ALARM_OFF)
            self.alarm_label.config(fg='black')
            
    def close(self):
        print("Application-Shutdown")
        self.master.destroy()

    
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = Application(app_win).pack(fill='both', expand=True, padx=8, pady=8)
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()      
Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@jbaben: dieses Grid Layout sieht doch ganz gut aus, oder?

Code: Alles auswählen

import tkinter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.frame = Frame(self)
        self.frame.pack(expand=1,fill='both')

class Frame(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.button = tk.Button(self,text='Alarm aktivieren')
        self.button.grid(column=6,sticky='ew',pady=2,row=2)
        self.button_1 = tk.Button(self,text='Feueralarm')
        self.button_1.grid(column=6,sticky='ew',pady=2,row=4)
        self.button_2 = tk.Button(self,text='Medical')
        self.button_2.grid(column=6,sticky='ew',pady=2,row=5)
        self.button_3 = tk.Button(self,text='Panik')
        self.button_3.grid(column=6,sticky='ew',pady=2,row=6)
        self.button_4 = tk.Button(self,text='Service')
        self.button_4.grid(column=6,sticky='ew',pady=2,row=7)
        self.button_5 = tk.Button(self,text='Close')
        self.button_5.grid(column=1,sticky='ew',columnspan=2,pady=2,row=7)
        self.button_6 = tk.Button(self,state='disabled',relief='flat',text='button')
        self.button_6.grid(column=6,sticky='ew',pady=2,row=3)
        self.frame = tk.Frame(self,width=16,height=16)
        self.frame.grid(column=7,row=0)
        self.frame_1 = tk.Frame(self,width=16,height=16)
        self.frame_1.grid(column=7,row=8)
        self.frame_2 = tk.Frame(self,width=16,height=16)
        self.frame_2.grid(row=8)
        self.frame_3 = tk.Frame(self,width=16,height=16)
        self.frame_3.grid(column=5,row=0)
        self.label = tk.Label(self,text='Alarmzone',font='12')
        self.label.grid(column=1,sticky='ew',columnspan=3,pady=5,padx=5,row=1)
        self.label_1 = tk.Label(self,text='Alarm inaktiv')
        self.label_1.grid(column=6,row=3)
        self.radiobutton = tk.Radiobutton(self,value=1,text='A',font='12')
        self.radiobutton.grid(column=1,padx=5,row=2)
        self.radiobutton_1 = tk.Radiobutton(self,value=2,text='B',font='12')
        self.radiobutton_1.grid(column=2,row=2)
        self.radiobutton_2 = tk.Radiobutton(self,value=3,text='C',font='12')
        self.radiobutton_2.grid(column=3,row=2)
        self.radiobutton_3 = tk.Radiobutton(self,value=4,text='D',font='12')
        self.radiobutton_3.grid(column=4,row=2)
        self.text = tk.Text(self,height=5,width=30)
        self.text.grid(column=1,rowspan=3,columnspan=4,row=3)

Application().mainloop()
Habe Frames als Abstandshalter eingesetzt: 3 Frames an den Ecken und einer in der Spalte vor den Buttons rechts.
Den Label "Alarm aktiv" habe ich über einen Button mit state disabled und relief flat platziert, damit auch in dieser Zeile die Höhe stimmt.

Die Frames könnte man auch unsichtbar machen durch Höhe oder Breite 0, das würde einen weiteren Frame erfordern und dann abwechselnd an den Ecken, etwa im Uhrzeichersinn: breit, hoch, breit, hoch
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Zeile 28 und 29 kann man löschen, denn es reicht für zwei diagonal gegenüberliegende Ecken
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

wuf hat geschrieben:Hi jbaben
Hier ein Prototyp-Skript bei welchem nur der 'pack' Layout Manager zum Einsatz kommt:
Damit man die Struktur dieses pack layouts deutlicher sieht. Sorry, dass ich die Variablennamen nicht abgeschrieben habe:

Code: Alles auswählen

import tkinter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.frame = Frame_1(self)
        self.frame.pack(padx=8, expand=1, fill='both', pady=8)

class Frame_1(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.frame = Frame_2(self)
        self.frame_1 = Frame1(self)
        self.frame.pack(fill='x')
        self.frame_1.pack(expand=1, fill='both')

class Frame_2(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.label = tk.Label(self,font='Helvetica 16 bold', width=20, anchor='w', text='Alarmzone', fg='blue')
        self.label.pack(padx=5, fill='x', pady=5, side='left')

class Frame1(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.frame = Frame_3(self)
        self.frame_1 = Frame1_1(self)
        self.frame.pack(expand=1, fill='both', side='left')
        self.frame_1.pack(expand=1, fill='both', side='left')

class Frame_3(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.frame = Frame_4(self)
        self.text = tk.Text(self)
        self.frame.pack(fill='x')
        self.text.pack(expand=1, fill='both')

class Frame_4(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.radiobutton = tk.Radiobutton(self,font='16', value=0, anchor='w', text='A')
        self.radiobutton_1 = tk.Radiobutton(self,font='16', value=1, anchor='w', text='B')
        self.radiobutton_2 = tk.Radiobutton(self,font='16', value=2, anchor='w', text='C')
        self.radiobutton_3 = tk.Radiobutton(self,font='16', value=3, anchor='w', text='D')
        self.radiobutton.pack(expand=1, fill='x', side='left')
        self.radiobutton_1.pack(expand=1, fill='x', side='left')
        self.radiobutton_2.pack(expand=1, fill='x', side='left')
        self.radiobutton_3.pack(expand=1, fill='x', side='left')

class Frame1_1(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.button = tk.Button(self,textvariable='PY_VAR2', text='Alarm aktivieren')
        self.button_1 = tk.Button(self,text='Beenden')
        self.frame = Frame_5(self)
        self.label = tk.Label(self,font='Helvetica 16 bold', textvariable='PY_VAR1', width=20, text='Alarm inaktiv')
        self.label.pack()
        self.button.pack(expand=1)
        self.frame.pack(expand=1)
        self.button_1.pack(side='bottom')

class Frame_5(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.button = tk.Button(self,width=20, text='Feueralarm')
        self.button_1 = tk.Button(self,width=20, text='Medical')
        self.button_2 = tk.Button(self,width=20, text='Panik')
        self.button_3 = tk.Button(self,width=20, text='Service')
        self.button.pack()
        self.button_1.pack()
        self.button_2.pack()
        self.button_3.pack()

Application().mainloop()
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,
ersteinmal vielen Dank für Eure viele Mühe mit den Vorschlägen.
Muss ich mir aber noch in Ruhe anschauen und verarbeiten. Tolle Hilfe.
Alfons Mittelmeyer: Dein Vorschlag von Mo. 8.Mai 18:18 so habe ich mir die Anordnung gedacht. Leider konnte ich mein Bild "sz2.gif" nicht zeigen, da ich nicht weiss wie man hier ein Image hochläd ?
Zum GuiDesigner:
unter dem Raspi kann ich ihn mit "python3 main.py" starten.
unter WINDOWS mit "python main.py" kommt die Meldung: "Traceback (most recent call last): File "main.py", line1, in <module> import DynTkInter as tk ModulNotFoundError: No module named 'DynTkInter'

wuf: auch vielen Dank für Deinen Code, werde ich mir anschauen.

Brauche nun ein wenig Zeit um Eure Arbeit zu verarbeiten.

MfG

Juergen B.
:D
beertonic
User
Beiträge: 37
Registriert: Montag 8. Mai 2017, 15:26

Bei Linux sind die Tk Pakete standardmäßig dabei, in Windows musst du sie installieren.
BlackJack

@beertonic: Ich hätte das ja eher umgekehrt gesehen: Bei Linux sind sie in der Regel in extra Paketen, weil man auf einem Server sonst Python nicht ohne einen ganzen Haufen GUI-Abhängigkeiten installieren könnte.

Ist aber in diesem Fall egal weil `DynTkInter` kein Modul aus der Python-Standardbibliothek ist.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

jbaben hat geschrieben:unter WINDOWS mit "python main.py" kommt die Meldung: "Traceback (most recent call last): File "main.py", line1, in <module> import DynTkInter as tk ModulNotFoundError: No module named 'DynTkInter'
Das verstehe ich jetzt nicht. DynTkInter.py hat doch keine deutschen Umlaute und sollte sich mit import DynTkInter importieren lassen. Rausgelöscht hast Du es zufällig nicht?
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

zu GuiDesigner: das Modul "DynTkInter.py" ist im gleichen Direktorie (Pfad) wie "main.py" vorhanden.
Vielleicht liegt das Problem mit der Einstellung meiner Umgebungsvariablen (PATH).
OS = WINDOWS 10 Pro 64 Bit

MfG

Juergen B.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

jbaben hat geschrieben:zu GuiDesigner: das Modul "DynTkInter.py" ist im gleichen Direktorie (Pfad) wie "main.py" vorhanden.
Vielleicht liegt das Problem mit der Einstellung meiner Umgebungsvariablen (PATH).
OS = WINDOWS 10 Pro 64 Bit
Ich weiß auch nicht. Habe geschaut ob ich irgend ein __pycache__ mit auf github draufgespielt habe. Aber war nicht der Fall. Habe es auch einmal mit Windows 7 ultimate probiert. Ging auch. Bis auf eine Kleinigkeit: hatte im Menü leere Label als Platzhalter eingesetzt, aber in Windows sah man da: ( )

Scheint ein allgemeines Problem bei Deinem Windows zu sein, daß Du in Python nichts importieren kannst. Mußt Du eben selber rausfinden, woran das liegt.
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

so nun habe ich mir den gezeigten Code zu meiner Anordnung angeschaut.
Am besten hat mir der Code von "wuf" gefallen.
Da bei diesem Beispiel mit dem "Pack Manager" auch das maximieren funktioniert.
Bei dem Beispiel mit dem "Grid Manager" ist die Anordnung der Elemente Ok, jedoch funktioniert hier das maximieren nicht (die Elemente wandern nicht mit).

Das Problem ist nun das ich die Syntax im Code verstehen muss um den Code entsprechend meinen Anforderungen ändern zu können.

Vielen Dank noch einmal für Eure Hilfe.

MfG

Juergen B.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

[quote="jbaben"Am besten hat mir der Code von "wuf" gefallen.
Da bei diesem Beispiel mit dem "Pack Manager" auch das maximieren funktioniert.
Bei dem Beispiel mit dem "Grid Manager" ist die Anordnung der Elemente Ok, jedoch funktioniert hier das maximieren nicht (die Elemente wandern nicht mit).[/quote]
Ja stimmt, bei grid paß sich die Containergröße dem Platz, welche die grid widgets darin haben, an.
Vielleicht steht aber hier bei columnconfigure und rowconfigure der weight parameter damit im Zusammenhang. Muß ich mal ausprobieren. Könnte sein, daß es dann doch geht.

Bei pack kann man auch dafür sorgen, dass sich die Widgetgröße der Containergröße anpaßt, sofern dieser groß genug ist.
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

so habe nun den Code um ein neues Fenster erweitert:

Code: Alles auswählen

def service(self):
        service = tk.Toplevel()
        frame = tk.Frame(service)
        service.title('Service-Seite')
        frame.pack()
        # Frame fuer Button "Auswahl Alarmzone"
        service.button1_frame = tk.Frame(service)
        service.button1_frame.pack(fill='x')
        # Button "Auswahl Alarmzone"
        Button_Select1 = tk.Button(service.button1_frame, text='Auswahl Alarmzone', font = 12, command = self.select_alarmzone )
        Button_Select1.pack(side='left', fill='x', padx=0, pady=0)
        # Frame fuer Button "Benutzer Verwaltung"
        service.button2_frame = tk.Frame(service)
        service.button2_frame.pack(fill='x')
        # Button "Benutzer Verwaltung"
        Button_Select2 = tk.Button(service.button2_frame, text='Benutzer Verwaltung', font = 12, command = self.benutzer_verwaltung )
        Button_Select2.pack(side='left', fill='x', padx=0, pady=0)
        # Frame fuer Button "zurück"
        service.button3_frame = tk.Frame(service)
        service.button3_frame.pack(fill='x')
        # Button zum Schließen des Fensters
        ButtonBack = tk.Button(service.button3_frame, text='zurück', command=self.haupt)
        ButtonBack.pack(side='left', fill='x', padx=0, pady=0)
Sieht zwar noch nicht so aus wie ich mir das vorstelle.
Meine Frage zu dem neuen Fenster: wie kann ich das neue Fenster über den Button "zurück" beenden ?
Mit "self.service.destroy() klappt es nicht.

MfG
Juergen B.
:?:
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

ich habe den Fehler gefunden (habe das "self" vergessen).
So funktioniert das schließen des Fensters mit "self.service.destroy()"

Code: Alles auswählen

def service(self):
        # neues Fenster erzeugen
        self.service = tk.Toplevel()
        self.frame = tk.Frame(self.service)
        self.service.title(SERVICE_TITLE)
        self.service.geometry("+{}+{}".format(SERVICE_XPOS, SERVICE_YPOS))
        self.service.geometry("{}x{}".format(SERVICE_WIDTH, SERVICE_HEIGHT))
        self.frame.pack()
        
        # Frame fuer Button "Auswahl Alarmzone"
        self.service.button1_frame = tk.Frame(self.service)
        self.service.button1_frame.pack(fill='both', expand=True)
        # Button "Auswahl Alarmzone"
        Button_Select1 = tk.Button(self.service.button1_frame, text='Auswahl Alarmzone', font = 12, command = self.select_alarmzone )
        Button_Select1.pack(side='left', fill='x', padx=5, pady=0)
        # Frame fuer 
        self.service.z1_frame = tk.Frame(self.service)
        self.service.z1_frame.pack(fill='x')
        # Frame fuer Button "Benutzer Verwaltung"
        self.service.button2_frame = tk.Frame(self.service)
        self.service.button2_frame.pack(fill='both', expand=True)
        # Button "Benutzer Verwaltung"
        Button_Select2 = tk.Button(self.service.button2_frame, text='Benutzer Verwaltung', font = 12, command = self.benutzer_verwaltung )
        Button_Select2.pack(side='left', fill='x', padx=5, pady=0)
        # Frame fuer Button "zurück"
        self.service.button3_frame = tk.Frame(self.service)
        self.service.button3_frame.pack(fill='both', expand=True)
        # Button zum Schließen des Fensters
        ButtonBack = tk.Button(self.service.button3_frame, text='zurück', command=self.haupt)
        ButtonBack.pack(side='left', fill='x', padx=5, pady=0)
MfG

Juergen B.
:D
Antworten