Hier etwas zum austesten:
Code: Alles auswählen
def set_scrolled_entries(self, parent, label_names, result, screeny):
self.entry_vars = [tk.StringVar() for _ in label_names]
self.entries = list()
scroll_frame = tk.Frame(parent, bg='red')
canvas = tk.Canvas(scroll_frame, highlightthickness=0)
canvas.grid(row=0, column=1, sticky=tk.NSEW)
#xscroll = tk.Scrollbar(scroll_frame, orient=tk.HORIZONTAL,
#command=canvas.xview)
xscroll = tk.Scrollbar(scroll_frame, orient=tk.HORIZONTAL,
command=self.horizontal_scroll)
xscroll.grid(row=1, column=1, sticky=tk.EW)
self.xscroll = xscroll
yscroll = tk.Scrollbar(scroll_frame, orient=tk.VERTICAL,
command=canvas.yview)
yscroll.grid(row=0, column=2, sticky=tk.NS)
canvas.config(xscrollcommand=xscroll.set)
scroll_frame.grid_rowconfigure(1, weight=1)
#canvas.config(yscrollcommand=xscroll.set)
canvas.config(yscrollcommand=yscroll.set)
scroll_frame.grid_rowconfigure(0, weight=1)
self.canvas = canvas
#self.bind_scroll(xscroll, self.x_scroll)
#self.bind_scroll(xscroll, self.horizontal_scroll)
self.bind_scroll(yscroll, self.y_scroll)
label_frame = tk.Frame(canvas)
ENTRY_IPADX = 5 # Abstand zu Text in x
ENTRY_IPADY = 2 # Abstand zu Text in y
for i, (var, name) in enumerate(zip(self.entry_vars,
self.label_names)):
label_container = tk.Frame(label_frame,)
label_container.grid(row=i, column=0, padx=10, pady=10,
sticky=tk.NW)
label = tk.Label(label_container, text=name,
font=self.conf['font'])
label.grid(ipady=5, sticky=tk.W)
entry_container = tk.Frame(label_frame,relief='sunken',
bd=1, bg=self.conf['entry_bg'])
entry_container.grid(row=i, column=1)
entry = tk.Entry(entry_container, textvariable=var, width=70,
font=self.conf['font'], bg=self.conf['entry_bg'], bd=0,
highlightthickness=0)
entry.grid(row=0, column=0, padx=ENTRY_IPADX, pady=ENTRY_IPADY)
entry.bind("<FocusIn>", self.entry_focus_callback)
try:
var.set(''.join([row[i] for row in result]))
except IndexError:
var.set('IndexError')
self.entries.append(var)
canvas.create_window(0, 0, window=label_frame, anchor=tk.NW)
canvas.update_idletasks()
x, y, w, h = label_frame.bbox(tk.ALL)
h_max = h
if h > (self.screeny - 150):
h_max = (self.screeny - 150)
canvas.config(scrollregion=(x, y, w, h), width=w, height=h_max)
return scroll_frame
def check(self, event):
self.controller.process(self.items)
def run(self):
self.root.mainloop()
def bind_scroll(self, widget, mode):
#~~ Windows
widget.bind("<MouseWheel>", mode)
#~~ Linux
widget.bind("<Button-4>", mode)
widget.bind("<Button-5>", mode)
def entry_focus_callback(self, event):
print('Focus')
event.widget.config(xscrollcommand=self.xscroll.set)
self.entry_focus_pointer = event.widget
def horizontal_scroll(self, *args):
scroll_mode, value = args[0], args[1]
print(scroll_mode, value)
if scroll_mode == "scroll":
units = args[2]
self.entry_focus_pointer.xview_scroll(value, units)
elif scroll_mode == "moveto":
self.entry_focus_pointer.xview_moveto(value)
def x_scroll(self, event):
if event.num == 5 or event.delta < 0:
self.canvas.xview_scroll(1, "unit")
elif event.num == 4 or event.delta > 0:
self.canvas.xview_scroll(-1, "unit")
def y_scroll(self, event):
if event.num == 5 or event.delta < 0:
self.canvas.yview_scroll(1, "unit")
elif event.num == 4 or event.delta > 0:
self.canvas.yview_scroll(-1, "unit")
Löst der obige Code noch nicht!Nobuddy hat geschrieben:Ich habe den Code für die X-Scrollbar weiter nach unten, unter die for-Schleife getan, da die X-Scrollbar nicht über label und entry gehen soll, sondern nur auf das entry-Feld.
Gruß wuf
