Probleme Anordnung Label- und Entry-Tabelle bei Toggle-Widget

Fragen zu Tkinter.
Antworten
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo an Alle,

ich habe in meiner GUI ein Toggle-Widget eingearbeitet. Unten der Code des ToggleFrames. Dies benutze ich in meiner GUI und setze darin Entries und Labels als Tabelle mittels GRID. Das funktioniert schon gut, aber ich möchte alle Tabellen mit gleicher Tabellenspalte, also hatte ich bei den Labels mit width die Breite vorgegeben und damit wurde die sticke-Funktion wieder anuliert.
Wenn ich den Ansatz mit weiteren Frames in der Class ToggleFrame2 versuche, also ein Hauptframe mit den bereits angegebenen Frames als ChildFrames, dann werden diese vor alle GUI-Frames gesetzt.
Ich hatte noch den Ansatz alles mit Grid anzugeben, aber dann kann ich wiederum die Seitenanpassung nicht automatisch machen.

Also alles ziemlich verwirrend. Ich hoffe jemand kann mir dabei helfen. :( Ich weiß erst einmal nicht, wie ich jetzt weiter machen soll.

Code: Alles auswählen

class GUI()

	self.t4 = ToggledFrame2(self.Frame20, text='Daten zum Wagenkasten', relief="raised", borderwidth=1)
	self.t4.pack(fill="x", expand=0, pady=2, padx=2, anchor="n")
	self.entrys4 = []
	self.labels4 = []
	c=0
	for Text in VehicleMeasure:
		self.labels4.append(Label(self.t4.sub_frameCC, text=Text, relief=FLAT, font=("Arial",fontsize_Dateneingabe)))
		self.labels4[-1].grid(padx=0, pady=0, row=c, column=0, sticky = W)
		self.entrys4.append(Entry(self.t4.sub_frameCC, relief=SUNKEN, font=("Arial",fontsize_Dateneingabe)))
		self.entrys4[-1].grid(padx=0, pady=0, row=c, column=1, sticky = E)
		entriesA.append(self.entrys4)
		c=c+1

Code: Alles auswählen

class ToggledFrame2(Frame):

	def __init__(self, parent, text="", *args, **options):
		Frame.__init__(self, parent, *args, **options)
	
		self.show = IntVar()
		self.show.set(1)
		
		
		self.title_frame = ttk.Frame(self)
		self.title_frame.pack(fill="x", expand=0)

		ttk.Label(self.title_frame, text=text, font=("Arial",fontsize_Datenueberschrift), width=100).pack(side="left", fill="x", expand=1)

		self.toggle_button = ttk.Checkbutton(self.title_frame, width=100, text='+', command=self.toggle2, variable=self.show, style='TFrame', onvalue=1, offvalue=0)
		self.toggle_button.pack(side="left")

		self.sub_frameAA = Frame(self, relief="sunken", borderwidth=1)
		self.sub_frameBB = Frame(self, relief="sunken", borderwidth=1)
		self.sub_frameCC = Frame(self, relief="sunken", borderwidth=1)
		self.sub_frameDD = Frame(self, relief="sunken", borderwidth=1)
		self.sub_frameEE = Frame(self, relief="sunken", borderwidth=1)
		self.sub_frameFF = Frame(self, relief="sunken", borderwidth=1)
		self.sub_frameGG = Frame(self, relief="sunken", borderwidth=1)		
		
		self.sub_frameAA.pack(fill="x", expand=1)
		self.sub_frameBB.pack(fill="x", expand=1)
		self.sub_frameCC.pack(side=LEFT)
		self.sub_frameDD.pack(side=LEFT, fill=X)		
		
		self.toggle_button.configure(text='-')
			
	def toggle2(self):
		#ToDo
	
Zuletzt geändert von Anonymous am Mittwoch 19. April 2017, 21:19, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

stefanxfg hat geschrieben:aber ich möchte alle Tabellen mit gleicher Tabellenspalte, also hatte ich bei den Labels mit width die Breite vorgegeben und damit wurde die sticke-Funktion wieder anuliert.
Da kapiere ich nicht ganz, was Du meinst. Aber den Labeln gleiche Breite geben und dennoch die Schrift links haben, kann man machen. sticky="w" ordnet den Label in der Grid Spalte links an. Wenn der Label so breit ist wie die Beschriftung, ist dann natürlich auch die Beschriftung links in der Grid Spalte. Wenn man eine größere Labelbreite nimmt, dann wird der Label bei sticky='w' auch links in der Grid Spalte angeordnet. Da aber per Default deie Beschriftung zentriert angeordnet ist, erscheint dann die Beschriftung zentriert.

Eine linksbündige Labelbeschriftung bekommst Du, wenn Du beim Label anchor="w" setzt.

Eine andere Möglichkeit gibt es auch noch für gleichbleibende Tabellenbreiten und Höhen: Man kann auch Tabellenbreiten und -höhen setzen. Hierzu gibt es für container widgets folgende Funktionen:

grid_columnconfigure
grid_rowconfigure
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo,

da sieht man mal wie blind ich war. Danke für deine schnelle Antwort. Ich habe noch ein anderes Problem. Ich die oben beschriebenen Labels und Entries als Tabelle ein. Ich möchte ein Kontextmenü mit der rechten Maustaste aktiv schalten.
Bisher füge ich diese über Listenelemente ein. Später greife ich wieder auf diese zurück, um diese zu füllen. Dies habe ich nun ausgegraut.
Die andere Variante meinen Wunsch umzusetzen erfolgt gemäß nachfolgendem Code. Jedoch füge ich meiner Meinung nach jedes Entry mit dem selben Namen ein. Dies erzeugt ein Problem beim nachfülgendem Füllen der ENtries.

Code: Alles auswählen

		self.t4 = ToggledFrame2(self.Frame20, text='Daten zum Wagenkasten', relief="raised", borderwidth=1)
		self.t4.pack(fill="x", expand=0, pady=2, padx=2, anchor="n")
		#self.entrys4 = []
		#self.labels4 = []
		c=0
		for Text in VehicleMeasure:
			self.labels4 = Label(self.t4.sub_frameCC, text=Text, relief=FLAT, font=("Arial",fontsize_Dateneingabe), width=60, anchor="w")
			self.labels4.bind("<Button-3>", self.popupA)
			self.labels4.grid(padx=0, pady=0, row=c, column=0, sticky = W)
			#self.labels4.append(Label(self.t4.sub_frameCC, text=Text, relief=FLAT, font=("Arial",fontsize_Dateneingabe), width=60, anchor="w"))
			#self.labels4[-1].grid(padx=0, pady=0, row=c, column=0, sticky = W)
			self.entrys4 = Entry(self.t4.sub_frameCC, relief=SUNKEN, font=("Arial",fontsize_Dateneingabe), width=100)
			self.entrys4.bind("<Button-3>", self.popupA)
			self.entrys4.grid(padx=0, pady=0, row=c, column=1, sticky = W+E+N+S)
			#self.entrys4.append(Entry(self.t4.sub_frameCC, relief=SUNKEN, font=("Arial",fontsize_Dateneingabe), width=100))
			#self.entrys4[-1].grid(padx=0, pady=0, row=c, column=1, sticky = W+E+N+S)
			#entriesA.append(self.entrys4)
			c=c+1
Zuletzt geändert von Anonymous am Donnerstag 20. April 2017, 19:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@stefanxfg: Wenn Du nur eine Variable hast, nämlich nur für das letzte Entry Feld und noch nachträglich auf die Entry Felder zugreifen willst, dann hast Du ein Problem. Dann schreib doch die Verweise auf die Entryfelder noch in eine Liste: leere Liste zu Beginn [] dann jeweils ein append, etwa: self.all_entries.append(self.entries4)
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Danke, ich habe es so gemacht und es funktioniert.
Antworten