Bei FocusIn in Entry, entry configurieren
Verfasst: Dienstag 13. Januar 2015, 09:44
Hallo zusammen,
Wie kann ich, in nachfolgendem Code, mir das Entry ausgeben lassen, auf welchem ich den Focus per Maus z.B. setze?
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
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