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()
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