Hallo zusammen,
ich möchte mit Tkinter ein Fenster mit 12 Buttons ( 4x4 ) erstellen, welche sich beim vergrößeren des Fensters automatisch in der Größe anpassen.
Dabei sollen die Buttons den gesamten Fensterinhalt ausfüllen.
Mit welchem Layoutmanager macht man dies am besten , ohne externe module? (pack, grid oder place)
Ein kleines Code-Beispiel würde auch helfen.
Danke
welchen Layoutmanager verwenden
Hallo!
Hier: https://tkdocs.com/tutorial/index.html gibt es Infos zu grit. Automatisch geht mit place gar nichts und pack ist zwar etwas einfacher zu benutzen, aber nicht so gut zu kontrollieren, was es macht.
Hier: https://tkdocs.com/tutorial/index.html gibt es Infos zu grit. Automatisch geht mit place gar nichts und pack ist zwar etwas einfacher zu benutzen, aber nicht so gut zu kontrollieren, was es macht.
Das ist mein Code.
Code: Alles auswählen
from tkinter import *
class App(Tk):
def __init__(self):
super().__init__()
# configure the root window
self.title('Memory Game')
#self.geometry('600x400')
self.pack_slaves()
# button grid
def neues_Spiel():
spalte = 0
zeile = 0
for i in range(16):
self.btn_name = "button" + str(i)
self.btn_name = Button(self, text="Karte" + str(i), width=3, height=3)
self.btn_name.grid(column=spalte, row=zeile)
if spalte < 3:
spalte += 1
else:
spalte = 0
zeile += 1
neues_Spiel()
if __name__ == "__main__":
app = App()
app.mainloop()
Danke für den Link., hat mir weiter geholfen.juwido hat geschrieben: ↑Sonntag 29. Oktober 2023, 17:29 Hallo!
Hier: https://tkdocs.com/tutorial/index.html gibt es Infos zu grit. Automatisch geht mit place gar nichts und pack ist zwar etwas einfacher zu benutzen, aber nicht so gut zu kontrollieren, was es macht.
Jetzt geht es.
Code: Alles auswählen
from tkinter import *
class App(Tk):
def __init__(self):
super().__init__()
# configure the root window
self.title('Memory Game')
#self.geometry('600x400')
# button grid
def neues_spiel():
spalte = 0
zeile = 0
for i in range(16):
self.btn_name = "button" + str(i)
self.btn_name = Button(self, text="Karte" + str(i), width=3, height=3)
self.btn_name.grid(column=spalte, row=zeile, sticky='nsew')
if spalte < 3:
spalte += 1
else:
spalte = 0
zeile += 1
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.rowconfigure(1, weight=1)
self.columnconfigure(2, weight=1)
self.rowconfigure(2, weight=1)
self.columnconfigure(3, weight=1)
self.rowconfigure(3, weight=1)
neues_spiel()
if __name__ == "__main__":
app = App()
app.mainloop()
Da muss man ein bisschen tricksen, so geht es:
Basierend auf https://stackoverflow.com/questions/759 ... in-tkinter
Code: Alles auswählen
from tkinter import *
class App(Tk):
def __init__(self):
super().__init__()
self.columnconfigure(tuple(range(4)), weight=1)
self.rowconfigure(tuple(range(4)), weight=1)
# configure the root window
self.title('Memory Game')
#self.geometry('600x400')
self.pack_slaves()
# button grid
def neues_Spiel():
for i in range(16):
self.btn_name = "button" + str(i)
self.btn_name = Button(self, text="Karte" + str(i), width=3, height=3)
self.btn_name.grid(column=i % 4, row=i // 4, sticky="news")
neues_Spiel()
if __name__ == "__main__":
app = App()
app.mainloop()
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal zwei und mal vier.
*-Importe benutzt man nicht. Man definiert keine Funktionen innerhalb von anderen Funktionen.
btn_name erst an einen String zu binden und dann an einen Button ist unsinnig. Wahrscheinlich möchtest Du alle Knöpfe in einer Liste speichern.
Statt spalte und zeile auszurechnen, würde man besser eine doppelte for-Schleife schreiben.
*-Importe benutzt man nicht. Man definiert keine Funktionen innerhalb von anderen Funktionen.
btn_name erst an einen String zu binden und dann an einen Button ist unsinnig. Wahrscheinlich möchtest Du alle Knöpfe in einer Liste speichern.
Statt spalte und zeile auszurechnen, würde man besser eine doppelte for-Schleife schreiben.
Code: Alles auswählen
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Memory Game')
self.buttons = []
for zeile in range(4):
for spalte in range(4):
button = tk.Button(self, text=f"Karte {spalte}/{zeile}", width=3, height=3)
button.grid(column=spalte, row=zeile, sticky=tk.NSEW)
self.buttons.append(button)
for spalte in range(4):
self.columnconfigure(spalte, weight=1)
for zeile in range(4):
self.rowconfigure(zeile, weight=1)
def main():
app = App()
app.mainloop()
if __name__ == "__main__":
main()
- __blackjack__
- User
- Beiträge: 13163
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@udo100: Da könnte eventuell `functools.partial()` nützlich sein.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Warum shift?
Buttons verhalten sich anders, als einfache Buttonevents, weil Buttons gedrückt und wieder losgelassen werden. Daher benutzt man das command-Argument, und am sinnvollsten, die Position des Buttons an die Aufruffunktion zu übermitteln, geht über functools.partial.
Buttons verhalten sich anders, als einfache Buttonevents, weil Buttons gedrückt und wieder losgelassen werden. Daher benutzt man das command-Argument, und am sinnvollsten, die Position des Buttons an die Aufruffunktion zu übermitteln, geht über functools.partial.
Shift ist natürlich quatsch. Habe functools.partial() nachgelesen aber keinen schimmer was ich damit machen soll.
Das ist für mich als Python-Anfänger noch zu kompliziert. Bin erst seit 2 Wochen dabei. Habe vorher mit Java programmiert.
Aber Danke für die Hinweise.
Das ist für mich als Python-Anfänger noch zu kompliziert. Bin erst seit 2 Wochen dabei. Habe vorher mit Java programmiert.
Aber Danke für die Hinweise.