Hilfe bei Fensterprojekt

Fragen zu Tkinter.
Antworten
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
bei meinem Fensterprojekt das ich mit Tkinter mache, brauche ich Eure Hilfe, da ich noch Anfänger bei Tkinter bin.

Ich habe die Fenstergröße definiert und einen Label links (Streifen), einen Label rechts (Streifen), einen Label unten (Streifen) und ein großes Textfenster in der Mitte platziert. Im unteren Label habe ich ein schmales Textfenster, sowie 3 Buttons erstellt.

Der linke und rechte Label sind für Buttons gedacht, wobei die Buttons auf dem rechten Label, die Buttons des linken Labels definieren sollen.
Beispiel: Ich betätige rechts den Button Kunden, dann sollte auf dem linken Label die für Kunden vorgesehen Buttons erscheinen.

Das Layout, was ich beschrieben habe, habe ich schon umgesetzt.
Das mit den rechten Buttons die, die linken Buttons steuern sollen, ist noch eine Baustelle.

Hier mein Code:

Code: Alles auswählen

class MyWindow(Tk):
    def __init__(self, callback):
        Tk.__init__(self)
        self.callback = callback
        # Fenster
        self.title('officeplanet')
        self.geometry('1280x1024')

        # Farbe Button-Frames
        bcolor = 'yellow'
        # Farbe Buttons
        bbcolor = 'grey'
        fbcolor = 'black'
        # Farbe Texteingabe, Textfenster
        btxt = 'black'
        ftxt = 'white'
        # Text Schrift
        font = 'NimbusSansL'
        # Textgröße Buttons, Texteingabe
        fontsize = 14
        # Textgröße 
        output_fontsize = 12
        
        # Frame links
        self.label_left = Label(self, width=15, background = bcolor)
        self.label_left.pack(side='left', fill='y')
        # Frame rechts
        label_right = Label(self, width=15, background = bcolor)
        label_right.pack(side='right', fill='y')

        # Textfenster
        txtWindow = Text(self, width=200, background = btxt,
                foreground = ftxt, font = (font, output_fontsize))
        txtWindow.pack(anchor='n', expand='YES', fill='y')

        # Frame unten
        label_down = Label(self, width=200, background = bcolor)
        label_down.pack(anchor='s', ipady=10, fill='x')
        # Frame unten, für Buttons und Eingabefeld
        label_down2 = Label(label_down, heigh=5, width=100,
                                                background = bcolor)
        label_down2.pack(anchor='s')
        # Text-Eingabe
        inputline = Entry(label_down2, width = 80,
                background = btxt, foreground = ftxt,
                font = (font, fontsize))
        inputline.pack(ipady=7, pady=15)

        # Button-Funktionen
        #############################################################
        # Bildschirm leeren
        def screen_blank():
            txtWindow.delete(1.0, END)
        # Dateien mit exterenem Programm öffnen
        def openfile():
            self.name = askopenfilename(filetypes=[("TXT-Formate",
                    ".txt .TXT .odt .ODT .doc .DOC"), ("CSV-Formate",
                    ".csv .CSV .xls .XLS"), ("PDF-Formate",
                    ".pdf .PDF")], initialdir=[os.environ['HOME']])
            if self.name:
                fileopen(self.name)
        # Datei öffnen und im Textfeld ausgeben
        def openfile_intern():
            self.name = askopenfilename(filetypes=[("TXT-Formate",
                    ".txt"), ("PDF-Formate", ".pdf .PDF")],
                    initialdir=[os.path.abspath(sys.argv[0])])
            if self.name:
                screen_blank()
                for line in fileinput.input(self.name):
                    txtWindow.insert(END, line)
        # Datei speichern
        def openfile_save_intern():
            self.filesave = open(self.name,"w")
            self.filesave.write(txtWindow.get(1.0,END))
            self.filesave.flush()
            self.filesave.close()

        #############################################################

        # Buttons rechts
        button_right = {
                '01-Kunden' : lambda: check_button('01'),
                '02-Lieferanten' : lambda: check_button('02'),
                '03-Auftrag' : '',
                '04-Bestellung' : '',
                '05-Rechnung' : '',
                '06-Verwaltung' : '',
                '07-Buchhaltung' : '',
                '08-EDV' : '',
                '09-Produkte' : '',
                '10-Open_Data' : openfile_intern,
                '11-Save_Data' : openfile_save_intern,
                '12-Clean' : screen_blank,
        }
        # Buttons links
        button_left = {
                '0101-Kunden' : '',
                '0102-Kunden_2' : '',
                '0103-Kunden_3' : '',
                '0201-Lieferanten' : '',
                '0202-Lieferanten_2' : '',
                '0203-Lieferanten_3' : '',
        }
        for b in sorted(button_right):
            Button(label_right, width=14, text=b.split('-')[1], 
                background = bbcolor,  font = (font, fontsize), 
                foreground = fbcolor, command=button_right[b]).pack(
                                            padx=3, ipady=2, pady=19)
        
        def check_button(subgroup):
            for b in sorted(button_left):
                group = b[:2]
                if subgroup != '' and group == subgroup:
                    Button(self.label_left, width=14, text=b.split('-')[1], 
                        background = bbcolor,  font = (font, fontsize), 
                        foreground = fbcolor, command=button_left[b]
                                        ).pack(padx=3, ipady=2, pady=19)

        # Buttons unten
        button = {
                '01-Suchen' : '',
                '02-Bearbeiten' : '',
                '03-Zurück' : '',
        }
        for b in sorted(button):
            Button(label_down2, width=15, text=b.split('-')[1], 
                background = bbcolor, font = (font, fontsize), 
                foreground = fbcolor, command=button[b]).pack(side='left', 
                ipadx=10, padx=35, pady=10)

        # Hauptmenü
        mainMenu = Menu(self, background = 'yellow')
        self.config(menu = mainMenu)
        mainmenu = {
                '01_Datei' : 'Datei',
                '02_EDV' : 'EDV',
                '03_Sicherheit' : 'Sicherheit',
        }
        submenu = {
                '011_Öffnen' : ['Öffnen', openfile],
                '012_Intern_öffnen' : ['Intern öffnen', openfile_intern],
                '013_Intern_speichern' : ['Intern speichern', openfile_save_intern],
                '014_Bildschirm_leeren' : ['Bildschirm leeren', screen_blank],
                '015_Einstellungen' : ['Einstellungen', ''],
                '016_Beenden' : ['Beenden', self.quit],
                '021_Daten_Update' : ['Daten-Update', ''],
                '022_Edit Basedata' : ['Edit Basedata', ''],
                '031_Backup' : ['Backup', ''],
                '032_Restore' : ['Restore', ''],
        }
        for m in sorted(mainmenu):
            name = ''.join(m[:2])
            name = Menu(mainMenu)
            mainMenu.add_cascade(label = m[3:], menu = name)
            for s in sorted(submenu):
                if m[:2] == s[:2]:
                    name.add_command(label = submenu[s][0],
                                        command = submenu[s][1])



class Controller(object):
    def __init__(self):
        self.view = MyWindow(self.berechne)
        self.berechne()                   # zur Initialisierung
        self.view.mainloop()
    def berechne(self):
        self.view.label_left.config()
        print('hallo controller')

if __name__ == '__main__':
    Controller()
Bevor ich weiter mache, würde ich mich über Eure Verbesserungsvorschläge freuen, die bestimmt angebracht sind.

Grüße Nobuddy
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Nobuddy

Du könntest die Schaltflächen, welche auf der linken Seite des Anwendungsfensters eingeblendet werden in einer Listbox als Einträge anzeigen.

Gruß wuf :wink:
Take it easy Mates!
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo wuf,
Danke für Deinen Tip, habe jetzt eine andere Lösung gefunden.
Ich erstelle beim Auswählen der rechten Buttons, ein zweites linkes Label, das wenn es schon existiert mit 'label.destroy()' gelöscht wird.
Ob das jetzt eine saubere Lösung ist, kann ich nicht beurteilen, jedenfalls funktioniert sie prima. :wink:

Hier nochmals mein aktueller Code, damit Ihr versteht, was ich meine:

Code: Alles auswählen

def screen_blank(commando):
    commando.delete(1.0, END)
# Dateien mit exterenem Programm öffnen
def openfile():
    name = askopenfilename(filetypes=[("TXT-Formate",
            ".txt .TXT .odt .ODT .doc .DOC"), ("CSV-Formate",
            ".csv .CSV .xls .XLS"), ("PDF-Formate",
            ".pdf .PDF")], initialdir=[os.environ['HOME']])
    if name:
       fileopen(name)
# Datei öffnen und im Textfeld ausgeben
def openfile_intern(commando):
    name = askopenfilename(filetypes=[("TXT-Formate",
            ".txt"), ("PDF-Formate", ".pdf .PDF")],
            initialdir=[os.path.abspath(sys.argv[0])])
    if name:
        screen_blank(commando)
        for line in fileinput.input(name):
            commando.insert(END, line)
# Datei speichern
def openfile_save_intern(commando):
    filesave = open(name,"w")
    filesave.write(commando.get(1.0,END))
    filesave.flush()
    filesave.close()


class View(Tk):
    def __init__(self):
        Tk.__init__(self)
        # Fenster
        self.title('officeplanet')
        self.geometry('1280x1024')
        

        # Farbe Button-Frames
        bcolor = 'yellow'
        # Farbe Buttons
        bbcolor = 'grey'
        fbcolor = 'black'
        # Farbe Texteingabe, Textfenster
        btxt = 'black'
        ftxt = 'white'
        # Text Schrift
        font = 'NimbusSansL'
        # Textgröße Buttons, Texteingabe
        fontsize = 14
        # Textgröße 
        output_fontsize = 12
        
        # Frame links
        self.label_left = Label(self, width=15, background = bcolor)
        self.label_left.pack(side='left', fill=BOTH)
        # Frame rechts
        self.label_right = Label(self, width=15, background = bcolor)
        self.label_right.pack(side='right', fill=BOTH)

        # Textfenster
        self.txtWindow = Text(self, width=200, background = btxt,
                foreground = ftxt, font = (font, output_fontsize))
        self.txtWindow.pack(anchor='n', expand='YES', fill=BOTH)

        # Frame unten
        label_down = Label(self, width=200, background = bcolor)
        label_down.pack(anchor='s', ipady=10, fill=BOTH)
        # Frame unten, für Buttons und Eingabefeld
        label_down2 = Label(label_down, heigh=5, width=100,
                                                background = bcolor)
        label_down2.pack(anchor='s')
        # Text-Eingabe
        inputline = Entry(label_down2, width = 80,
                background = btxt, foreground = ftxt,
                font = (font, fontsize))
        inputline.pack(ipady=7, pady=15)

        # Buttons rechts
        button_right = {
                '01-Kunden' : lambda: check_Button('01'),
                '02-Lieferanten' : lambda: check_Button('02'),
                '03-Auftrag' : '',
                '04-Bestellung' : '',
                '05-Rechnung' : '',
                '06-Verwaltung' : '',
                '07-Buchhaltung' : '',
                '08-EDV' : '',
                '09-Produkte' : '',
                '10-Open_Data' : lambda: openfile_intern(self.txtWindow),
                '11-Save_Data' : lambda: openfile_save_intern(self.txtWindow),
                '12-Clean' : lambda: screen_blank(self.txtWindow),
        }
        for b in sorted(button_right):
            Button(self.label_right, width=14, text=b.split('-')[1], 
                background = bbcolor,  font = (font, fontsize), 
                foreground = fbcolor, command=button_right[b]).pack(
                                            padx=3, ipady=2, pady=19)

        # Buttons links
        button_left = {
                '0101-Kunden' : '',
                '0102-Kunden' : '',
                '0103-Kunden' : '',
                '0104-Kunden' : '',
                '0105-Kunden' : '',
                '0106-Kunden' : '',
                '0107-Kunden' : '',
                '0108-Kunden' : '',
                '0109-Kunden' : '',
                '0110-Kunden' : '',
                '0111-Kunden' : '',
                '0112-Kunden' : '',
                '0201-Lieferanten' : '',
                '0202-Lieferanten' : '',
                '0203-Lieferanten' : '',
                '0204-Lieferanten' : '',
                '0205-Lieferanten' : '',
                '0206-Lieferanten' : '',
                '0207-Lieferanten' : '',
                '0208-Lieferanten' : '',
                '0209-Lieferanten' : '',
                '0210-Lieferanten' : '',
                '0211-Lieferanten' : '',
                '0212-Lieferanten' : '',
        }
        def check_Button(group):
            try:
                self.label_left0.destroy()
            except AttributeError:
                pass
            self.label_left0 = Label(self.label_left, width=15, background = bcolor)
            self.label_left0.pack(side='left', fill=BOTH)
            for b in sorted(button_left):
                if group != '' and group == b[:2]:
                    self.button = Button(self.label_left0, width=14, text=b.split('-')[1], 
                        background = bbcolor,  font = (font, fontsize), 
                        foreground = fbcolor, command=button_left[b])
                    self.button.pack(padx=3, ipady=2, pady=19)

        # Buttons unten
        button = {
                '01-Suchen' : '',
                '02-Bearbeiten' : '',
                '03-Zurück' : '',
        }
        for b in sorted(button):
            Button(label_down2, width=15, text=b.split('-')[1], 
                background = bbcolor, font = (font, fontsize), 
                foreground = fbcolor, command=button[b]).pack(side='left', 
                ipadx=10, padx=35, pady=10)

        # Hauptmenü
        mainMenu = Menu(self, background = 'yellow')
        self.config(menu = mainMenu)
        mainmenu = {
                '01_Datei' : 'Datei',
                '02_EDV' : 'EDV',
                '03_Sicherheit' : 'Sicherheit',
        }
        submenu = {
                '011_Öffnen' : ['Öffnen', openfile],
                '012_Intern_öffnen' : ['Intern öffnen', openfile_intern],
                '013_Intern_speichern' : ['Intern speichern', openfile_save_intern],
                '014_Bildschirm_leeren' : ['Bildschirm leeren', screen_blank],
                '015_Einstellungen' : ['Einstellungen', ''],
                '016_Beenden' : ['Beenden', self.quit],
                '021_Daten_Update' : ['Daten-Update', ''],
                '022_Edit Basedata' : ['Edit Basedata', ''],
                '031_Backup' : ['Backup', ''],
                '032_Restore' : ['Restore', ''],
        }
        for m in sorted(mainmenu):
            name = ''.join(m[:2])
            name = Menu(mainMenu)
            mainMenu.add_cascade(label = m[3:], menu = name)
            for s in sorted(submenu):
                if m[:2] == s[:2]:
                    name.add_command(label = submenu[s][0],
                                        command = submenu[s][1])


class Controller(object):
    def __init__(self):
        self.view = View()
        self.view.mainloop()

if __name__ == '__main__':
    c = Controller()
Den Code werde ich noch weiter verbessern müssen ...

Grüße Nobuddy

PS Nachtrag: Habe den Code nochmals geändert, in dem ich Funktionen die durch ein Button verwendet werden, über die Class gesetzt habe.

Über Verbesserungsvorschläge, freue ich mich immer! :wink:
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Nobuddy hat geschrieben:Ich erstelle beim Auswählen der rechten Buttons, ein zweites linkes Label, das wenn es schon existiert mit 'label.destroy()' gelöscht wird.
OK. Ist natürlich auch möglich. Was machst du wenn du >12 Kunden bzw. Lieferanten usw. hast?
Gruß wuf :wink:
Take it easy Mates!
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

wuf, habe mehr als 12 Lieferanten und Kunden. :wink:

Ich habe mir das folgendermaßen vorgestellt.
Die Buttons auf der rechten Seite, sind die Hauptgruppen, die linke Seite der Buttons sind die dazugehörigen Untergruppen.

Wähle ich auf der rechten Seite 'Kunden' aus, dann erhalte ich auf der linken Seite die Buttons für Kunden.
Dort habe ich dann Buttons wie: Neuanlage, Formulare, Registrierung, Konditionen, Bank, Info, Kunde, Angebot und History (Änderungen möglich).
Wenn ich jetzt auf der linken Seite dem Button 'Kunde', einen Kunden mir heraussuche dann sollten alle Buttons auf der linken Seite, die Infos nur für diesen Kunden ausgeben.
So habe ich mir das Schema vorgestellt.

Die Daten von Kunden usw. habe ich in TAB-getrennten Textdateien, die ich dann über die GUI abrufen und auch verändern.

Wenn ich einen Gedankenfehler habe oder Du evtl. Anregungen bzw. Verbesserungen dazu hast ... nur zu! :wink:
Freue mich über jeden Input.

Grüße Nobuddy
Antworten