Bei FocusIn in Entry, entry configurieren

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

Hallo zusammen,

Wie kann ich, in nachfolgendem Code, mir das Entry ausgeben lassen, auf welchem ich den Focus per Maus z.B. setze?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk


class GroupWork(object):

    def __init__(self, controller, result, name, max_width, color):

        #self.my_win = tk.Toplevel()
        self.my_win = tk.Tk()

        # Ermittle die Größe des Bildschirmes
        self.screenx = self.my_win.winfo_screenwidth()
        self.screeny = self.my_win.winfo_screenheight()

        self.controller = controller
        self.result = result
        self.label_names = name
        self.max_width = max_width
        self.color = color
        self.positionen = len(self.result)
        self.focus_ystart = 0

        self.frame = tk.Frame(self.my_win, bg='#822')
        self.frame.pack(side='top', expand=True)
        self.winLabel = tk.Label(self.frame, width=10, height=10)
        self.winLabel.pack(expand=True)

        if len(self.result) == 0:
            return self.controller.close()


    def set_scrolled_tables(self):

        if self.positionen == 0:
            return self.controller.close()
        if self.color != '':
            self.tabellenWindow = tk.Frame(self.winLabel, bg=self.color)
        else:
            self.tabellenWindow = tk.Frame(self.winLabel)
        self.tabellenWindow.grid(row=0, column=0, sticky=tk.NSEW)
        self.tabellenWindow.grid_rowconfigure(0, weight=1)
        self.tabellenWindow.grid_columnconfigure(0, weight=1)

        # Canvas für Daten
        self.canvas = tk.Canvas(self.tabellenWindow, bd=0)
        self.canvas.grid(row=1, column=0, sticky=tk.NSEW)

        # Buttons erstellen
        mybutton = (('Übernehmen', self.controller.take),
            ('Schließen', self.controller.close))
        self.len_max = (max([len(row[0])
            for row in mybutton]))
        self.button_frame = tk.Label(self.tabellenWindow)
        self.button_frame.grid(row=3, column=0, sticky=tk.W)
        for i, row in enumerate(mybutton):
            tk.Button(self.button_frame, width=self.len_max,
                text=row[0], command=row[1]).grid(row=0, column=i)

        self.xpos = 0
        self.ypos = 0

        self.set_labels()
        self.set_entrys()

        self.canvas.update_idletasks()
        x, y, w, h = self.canvas.bbox(tk.ALL)


    def set_labels(self):
        """Benennungsspalte erstellen"""

        self.names = len(self.label_names)
        if self.names > 0:
            labels = list()
            for s in range(self.names):
                label = tk.Label(self.canvas,
                    width=self.max_width[s], text=self.label_names[s],
                    bd=1, highlightthickness=1, anchor=tk.W)
                label.grid(row=0, column=s)
                self.canvas.create_window(self.xpos, self.ypos, 
                    window=label, anchor=tk.NW)
                self.xpos += label.winfo_reqwidth()
                labels.append(label)
            self.ypos += label.winfo_reqheight()


    def set_entrys(self):
        """Tabellenspalte erstellen"""

        last_line = len(self.result)
        self.entry_vars = dict()
        self.entry_focus = dict()
        for i, row in enumerate(self.result):
            row = list(row)
            self.xpos = 0
            entry_data = list()
            data = list()
            for s, width in enumerate(self.max_width):
                var = tk.StringVar()
                self.entry = tk.Entry(self.canvas, textvariable=var,
                    width=width, justify='left', bd=1, highlightthickness=1)
                self.entry.grid(row=i, column=s)
                self.entry.bind("<FocusIn>", self.color2bg)
                self.entry.bind("<FocusOut>", self.back2bg)
                try:
                    if self.none_focus:
                        pass
                except AttributeError:
                    self.none_focus = self.entry.cget("bg")
                if i == 0 and s == 0:
                    self.entry.config(bg='yellow')
                    self.entry.focus_set()
                self.canvas.create_window(self.xpos, self.ypos,
                    window=self.entry,anchor=tk.NW)
                self.xpos += self.entry.winfo_reqwidth()
                var.set(row[s])
                data.append(var)
                entry_data.append(self.entry)
            self.entry_focus[i] = entry_data
            self.entry_vars[i] = data
            self.ypos += self.entry.winfo_reqheight()


    def back2bg(self, event):
        """
        Bei Focusverlust in Entry, setze Backround zurück.
        """

        pass
        # entry.config(bg=self.none_focus)


    def color2bg(self, event):
        """
        Bei Focuserhalt in Entry, setze Backround auf gelb.
        """

        pass
        # entry.config(bg='yellow')


    def run(self):
        self.my_win.update()
        self.set_scrolled_tables()
        self.my_win.mainloop()


class Controller(object):

    def __init__(self, result, name, max_width, color):

        self.model = Model(result, name, max_width, color)
        self.view = GroupWork(self, self.model.result, self.model.name,
            self.model.max_width, self.model.color)
    
    def take(self):
        self.datacheck = True
        self.view.my_win.quit()
        self.view.my_win.destroy()

    def close(self):
        self.view.my_win.quit()
        self.view.my_win.destroy()

    def get_data(self):
        # Übergebe die veränderten und unveränderten Daten zum verarbeiten
        counter = 0
        line_counter = len(self.view.label_names)
        data = list()
        for number in self.view.entry_vars:
            line = list()
            for entry_var in self.view.entry_vars[number]:
                if counter < line_counter:
                    line.append(entry_var.get().upper())
                    counter += 1
                if counter == line_counter:
                    data.append(line)
                    counter = 0
        #print(data)
        return data

    def run(self):
        self.view.run()
        try:
            if self.datacheck:
                return self.get_data()
        except AttributeError:
            return None


class Model(object):

    def __init__(self, result, name, max_width, color):
        self.result = result
        self.name = name
        self.max_width = max_width
        self.color = color


def main():
    try:
        Controller(result, name, max_width, color).run()
    except NameError:
        result = [['', 'aaaaaaaaaaaaaa 123456'],
            ['', 'bbbbbbbbbbbbbbb 123456'],
            ['', 'vvvvvvvvvvvvvvv 123456'],
            ['', 'ccccccccccccccc 123456'],
            ['', 'xxxxxxxxxxxxx 123456'],
            ['', 'yyyyyyyyyyyyy 123456'],
            ['', 'sssssssssssssss 123456'],
            ['010', 'bbbbbbbbbbb 987456']]
        name = ['Kundennummer', 'Filialennummer']
        max_width = [20, 20]
        color = 'red'
        Controller(result, name, max_width, color).run()


if __name__ == '__main__':
    main()
Irgendwo habe ich mal was mit super() gelesen, das dies bewerkstelligen soll.
Keine Ahnung, ob dies auch für Tkinter anwendbar ist und wie ich dies in meinem Code einsetzen muß?

Hoffe, Ihr könnt mir da bei einer Lösung helfen!

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

Hi Nobuddy

Kannst du das folgende einmal ausprobieren:

Code: Alles auswählen

    def take(self):
        entry_widget = self.view.my_win.focus_get()
        if entry_widget.winfo_class() == 'Entry':
            print('Take', entry_widget.get())
        self.datacheck = True
        self.view.my_win.quit()
        self.view.my_win.destroy()
Gruss wuf :wink:
Take it easy Mates!
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo wuf,

schön von Dir zu lesen. :wink:
Beim Deinem Code, kommt bei mir als Ergebnis nur "Take", 'entry_widget.get()' bleibt leer.

Beim Googeln hier im Forum, bin ich darauf gestoßen: http://www.python-forum.de/viewtopic.php?f=18&t=25524
Dies funktioniert bei mir problemlos, egal wo ich mit der Maus hin klicke wird das Entry-Feld mit einer Farbe markiert und das zuvor markierte Feld zurück gesetzt.

Mein Code, sieht jetzt so aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk 


def activate(event):
    event.widget.__color = event.widget["bg"]
    event.widget.config(bg="yellow")
 
def deactivate(event):
    event.widget.config(bg=event.widget.__color)


class GroupWork(object):

    def __init__(self, controller, result, name, max_width, color):

        #self.my_win = tk.Toplevel()
        self.my_win = tk.Tk()

        # Ermittle die Größe des Bildschirmes
        self.screenx = self.my_win.winfo_screenwidth()
        self.screeny = self.my_win.winfo_screenheight()

        self.controller = controller
        self.result = result
        self.label_names = name
        self.max_width = max_width
        self.color = color
        self.positionen = len(self.result)
        self.focus_ystart = 0

        self.frame = tk.Frame(self.my_win, bg='#822')
        self.frame.pack(side='top', expand=True)
        self.winLabel = tk.Label(self.frame, width=10, height=10)
        self.winLabel.pack(expand=True)

        if len(self.result) == 0:
            return self.controller.close()


    def set_scrolled_tables(self):

        if self.positionen == 0:
            return self.controller.close()
        if self.color != '':
            self.tabellenWindow = tk.Frame(self.winLabel, bg=self.color)
        else:
            self.tabellenWindow = tk.Frame(self.winLabel)
        self.tabellenWindow.grid(row=0, column=0, sticky=tk.NSEW)
        self.tabellenWindow.grid_rowconfigure(0, weight=1)
        self.tabellenWindow.grid_columnconfigure(0, weight=1)

        # Canvas für Daten
        self.canvas = tk.Canvas(self.tabellenWindow, bd=0)
        self.canvas.grid(row=1, column=0, sticky=tk.NSEW)

        # Buttons erstellen
        mybutton = (('Übernehmen', self.controller.take),
            ('Schließen', self.controller.close))
        self.len_max = (max([len(row[0])
            for row in mybutton]))
        self.button_frame = tk.Label(self.tabellenWindow)
        self.button_frame.grid(row=3, column=0, sticky=tk.W)
        for i, row in enumerate(mybutton):
            tk.Button(self.button_frame, width=self.len_max,
                text=row[0], command=row[1]).grid(row=0, column=i)

        self.xpos = 0
        self.ypos = 0

        self.set_labels()
        self.set_entrys()

        self.canvas.update_idletasks()
        x, y, w, h = self.canvas.bbox(tk.ALL)


    def set_labels(self):
        """Benennungsspalte erstellen"""

        self.names = len(self.label_names)
        if self.names > 0:
            labels = list()
            for s in range(self.names):
                label = tk.Label(self.canvas,
                    width=self.max_width[s], text=self.label_names[s],
                    bd=1, highlightthickness=1, anchor=tk.W)
                label.grid(row=0, column=s)
                self.canvas.create_window(self.xpos, self.ypos, 
                    window=label, anchor=tk.NW)
                self.xpos += label.winfo_reqwidth()
                labels.append(label)
            self.ypos += label.winfo_reqheight()


    def set_entrys(self):
        """Tabellenspalte erstellen"""

        last_line = len(self.result)
        self.entry_vars = dict()
        for i, row in enumerate(self.result):
            row = list(row)
            self.xpos = 0
            data = list()
            for s, width in enumerate(self.max_width):
                var = tk.StringVar()
                self.entry = tk.Entry(self.canvas, textvariable=var,
                    width=width, justify='left', bd=1,
                    highlightthickness=1, takefocus=True)
                self.entry.grid(row=i, column=s)
                self.entry.bind("<FocusIn>", self.take)
                self.entry.bind("<FocusIn>", activate)
                self.entry.bind("<FocusOut>", deactivate)
                if i == 0 and s == 0:
                    self.entry.focus_set()
                self.canvas.create_window(self.xpos, self.ypos,
                    window=self.entry,anchor=tk.NW)
                self.xpos += self.entry.winfo_reqwidth()
                var.set(row[s])
                data.append(var)
            self.entry_vars[i] = data
            self.ypos += self.entry.winfo_reqheight()


    def run(self):
        self.my_win.update()
        self.set_scrolled_tables()
        self.my_win.mainloop()


class Controller(object):

    def __init__(self, result, name, max_width, color):

        self.model = Model(result, name, max_width, color)
        self.view = GroupWork(self, self.model.result, self.model.name,
            self.model.max_width, self.model.color)
    
    def take(self):
        self.datacheck = True
        self.view.my_win.quit()
        self.view.my_win.destroy()

    def close(self):
        self.view.my_win.quit()
        self.view.my_win.destroy()

    def get_data(self):
        # Übergebe die veränderten und unveränderten Daten zum verarbeiten
        counter = 0
        line_counter = len(self.view.label_names)
        data = list()
        for number in self.view.entry_vars:
            line = list()
            for entry_var in self.view.entry_vars[number]:
                if counter < line_counter:
                    line.append(entry_var.get().upper())
                    counter += 1
                if counter == line_counter:
                    data.append(line)
                    counter = 0
        #print(data)
        return data

    def run(self):
        self.view.run()
        try:
            if self.datacheck:
                return self.get_data()
        except AttributeError:
            return None


class Model(object):

    def __init__(self, result, name, max_width, color):
        self.result = result
        self.name = name
        self.max_width = max_width
        self.color = color


def main():
    try:
        Controller(result, name, max_width, color).run()
    except NameError:
        result = [['', 'aaaaaaaaaaaaaa 123456'],
            ['', 'bbbbbbbbbbbbbbb 123456'],
            ['', 'vvvvvvvvvvvvvvv 123456'],
            ['', 'ccccccccccccccc 123456'],
            ['', 'xxxxxxxxxxxxx 123456'],
            ['', 'yyyyyyyyyyyyy 123456'],
            ['', 'sssssssssssssss 123456'],
            ['010', 'bbbbbbbbbbb 987456']]
        name = ['Kundennummer', 'Filialennummer']
        max_width = [20, 20]
        color = 'red'
        Controller(result, name, max_width, color).run()


if __name__ == '__main__':
    main()
Grüße Nobuddy
Antworten