Hallo,
beim Aufbau einer checkbutton-Liste (3.000 Fälle) wird die Liste abgeschnitten.
Hier ein Beispiel-Programm:
import tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame, anchor="nw",
tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
self.populate()
def populate(self):
for row in range(3000):
t="Beispiel-Checkbutton %s" %row
button = tk.Checkbutton(self.frame, padx=7, relief=tk.RIDGE, text=t,
onvalue=1, offvalue=0, font='Courier 12')
button.grid(row=row, column=1, sticky='news')
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
example = Example(root)
example.pack(side="top", fill="both", expand=True)
root.mainloop()
Die Ausgabe des Programms:
| | Beispiel-Checkliste 0
----------------------------------------------
.....
| | Beispiel-Checkliste 1123
----------------------------------------------
| | Beispiel-Checkliste 1124
----------------------------------------------
| | Beispiel-Checkliste 1125
=======================
| | Beispiel-Checkliste 2999
Die Beispiel-Checklisten 1126 - 2998 werden nicht angezeigt und Beispiel-Checkliste 2999 durch doppelte Strich gekennzeichnet.
Gibt es einen Parameter, der die Komplettliste anzeigt?
tkinter canvas - checkbutton - Liste unvollständig
Hallo deland01,
ich hab keine Ahnung, weshalb so viele Checkbuttons in einer Spalte stehen sollen.
Wenn Du die 3000 auf drei Spalten zu je 1000 anordnest, funktionierts.
Wenn Du die Schrift auf 8p verkleinerst, reichen zwei Spalten.
Wenn Du die 3000 untereinander direkt in das Canvas plazierst, funktionierts auch.
Es scheint eine Grössenbeschränkung für Frames zu geben.
Vielleicht findest hier etwas ....https://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm
Hier mein Beispiel direkt in Canvas:Gruss
Peter
ich hab keine Ahnung, weshalb so viele Checkbuttons in einer Spalte stehen sollen.
Wenn Du die 3000 auf drei Spalten zu je 1000 anordnest, funktionierts.
Wenn Du die Schrift auf 8p verkleinerst, reichen zwei Spalten.
Wenn Du die 3000 untereinander direkt in das Canvas plazierst, funktionierts auch.
Es scheint eine Grössenbeschränkung für Frames zu geben.
Vielleicht findest hier etwas ....https://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm
Hier mein Beispiel direkt in Canvas:
Code: Alles auswählen
import tkinter as tk
class Example:
def __init__(self, root):
self.aussenrahmen = tk.Frame(root, width=400, height = 100)
self.aussenrahmen.pack(fill="x", expand=True)
self.canvas = tk.Canvas(self.aussenrahmen, borderwidth=0,
width=400, height=600, bg="yellow")
self.canvas.pack(side="left", expand=True)
self.scrollbar = tk.Scrollbar(self.aussenrahmen, orient="vertical",
command=self.canvas.yview)
self.scrollbar.pack(side="right", fill="y", expand=True)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.populate()
def populate(self):
koord_x1 = 14
koord_y1 = 8
for zeile in range(3000):
t="Beispiel-Checkbutton %s" %zeile
button = tk.Checkbutton(self.canvas, padx=7, relief=tk.RIDGE,
text=t, onvalue=1, offvalue=0,
font='Courier 8')
canvas_button = self.canvas.create_window((koord_x1, koord_y1),
anchor = "nw",
window=button)
koords = self.canvas.bbox(1)
koord_y1 += koords[3] - koords[1]
koords_gesamt = self.canvas.bbox(zeile+1)
hoehe = self.canvas.canvasy(koords_gesamt[3]+100)
self.canvas.configure(scrollregion=(0,0,100,hoehe))
if __name__ == "__main__":
root=tk.Tk()
example = Example(root)
root.mainloop()
Peter
Hallo Peter,
super - vielen Dank für die Hilfe.
Ich habe eine Anwendung für Übertragung von XML-Dateien geschrieben für den Transport via SSH zwischen 2 Linux-Host. Dort liegen in der Regel ca. 2.600 bis 2.700 XMLs. Unsere Textadministratoren können dabei exakt die gewünschten XMLs selektieren und die Übertragung anstoßen.
Viele Grüße
Eddi
super - vielen Dank für die Hilfe.
Ich habe eine Anwendung für Übertragung von XML-Dateien geschrieben für den Transport via SSH zwischen 2 Linux-Host. Dort liegen in der Regel ca. 2.600 bis 2.700 XMLs. Unsere Textadministratoren können dabei exakt die gewünschten XMLs selektieren und die Übertragung anstoßen.
Viele Grüße
Eddi