Positionierung über Grid

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Chorum
User
Beiträge: 7
Registriert: Sonntag 9. Januar 2022, 18:21

Hallo,

ich mache gerade die ersten Schritte in Python und habe da ein Problem.

Ich habe einen Button definiert und möchte ihn über Grid positionieren.

Code: Alles auswählen

#Fenster 1 Button
fenster1_button = ttk.Button (
                           root,
                           text = 'Fenster 1',
                           command=lambda: None
                           )
Sobald ich jedoch

Code: Alles auswählen

fenster1_button.grid(row=1,column=1)  
einfüge, läuft das Script nicht mehr.

ich sehe irgendwie den Fehler nicht :cry:
Könnte mir da jemand einen Wink geben?

bis denne
Chorum

Allgemeine Informationen:
Python Version : 3.10.1
tk-Version: 8.6.12
Windows 10 System
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie lautet die genaue Fehlermeldung? Wie sieht das gesamte Skript aus?
Chorum
User
Beiträge: 7
Registriert: Sonntag 9. Januar 2022, 18:21

Ich muss wohl erst das Grid initialisieren, bin aber noch nicht dahintergekommen wie ich das richtig mache.
Eine Fehlermeldung bekomme ich nicht. Ich nutze Notepad++ für den Anfang.

Es ist mein erstes Pythonscript, also erstmal nur zum reinfinden :

Code: Alles auswählen

import tkinter as tk
import sys
import socket
import json
import platform
import datetime
from datetime import datetime
from tkinter import ttk
from tkinter.ttk import Label
#master.title("grid() method")

#Parameter setzen
window_width    = 800
window_height   = 600
lefty           = 1

#tkinter Fenster setzen
root = tk.Tk()

#Variablen einlesen & berechnen
screen_width    = root.winfo_screenwidth()
screen_height   = root.winfo_screenheight()
screen_center_x = int((root.winfo_screenwidth()  / 2) - (window_width  / 2))
screen_center_y = int((root.winfo_screenheight() / 2) - (window_height / 2))
tkversion       = root.tk.call("info", "patchlevel")
pyversion       = platform.python_version()
Osversion       = platform.machine()
PCname          = platform.node()
PCsystem        = platform.system()
PCsystemversion = platform.release()
PCsystemedition = platform.win32_edition()
hostname        = socket.gethostname()
local_ip        = socket.gethostbyname(hostname)
PCip            = local_ip
PCWLANip        = socket.getfqdn()
#Uhrzeit         = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
Uhrzeit         = datetime.now().strftime('%H:%M:%S')
cbreite         = 5

#Fenstertitel 
root.title('Einstieg - Videotool')

#Fensterposition festlegen
root.geometry(f'{window_width}x{window_height}+{screen_center_x}+{screen_center_y}')

#Fenstergröße fixieren
root.resizable(False,False)

#Programm Icon setzen
root.iconbitmap('C:/Users/meinname/Python/pyproj/einstieg/medien/firma-Icon.ico')

#Grid Definition
root.columnconfigure(0, weight = 1, uniform="cbreite")
root.columnconfigure(1, weight = 1, uniform="cbreite")
root.columnconfigure(2, weight = 1, uniform="cbreite")
root.rowconfigure(0, weight = 1)
root.rowconfigure(1, weight = 1)



#Labels setzen
label1 = Label(root, text='tk-Version:'+tkversion).grid(row = 0, column = 0)
label2 = Label(root, text='py-Version:'+pyversion).pack(ipadx=1, ipady=9)
label3 = Label(root, text='Osversion:'+Osversion).pack(ipadx=1, ipady=8)
label4 = Label(root, text='PCname:'+PCname).pack(ipadx=1, ipady=7)
label5 = Label(root, text='PCsystem:'+PCsystem+PCsystemversion+PCsystemedition).pack(ipadx=1, ipady=6)
label6 = Label(root, text='IP:'+PCip).pack(ipadx=1, ipady=5)
label7 = Label(root, text='IP2:'+PCWLANip).pack(ipadx=1, ipady=4)
label8 = Label(root, text='Uhrzeit:'+Uhrzeit).pack(ipadx=1, ipady=3)

#Buttons---------------------------------------------------------------------------------------
beenden_button = ttk.Button (root, text = 'Beenden', command=lambda: root.quit())
fenster1_button = ttk.Button (root, text = 'Fenster 1', command=lambda: None)  
                           
#ttk.fenster1_button.grid(row=1,column=1)                
                           
#Button Positionen
beenden_button.pack(
    anchor="se",
    side=tk.BOTTOM
    #expand=true
)
#fenster1_button.pack(
#    anchor="sw",
#    side=tk.BOTTOM
#    #expand=true
#)




#Button Funktionen
#def bexit()

#-----------------------------------------------------------------------------------------------
#Tkinter ausführen
root.mainloop()

Im aktuellen Code versuche ich das erste Label per Grid zu platzieren.
Bitte dran denken ich fuchse mich gerade erst rein :)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

`grid` und `pack` darf man nicht mischen. Entweder das eine oder das andere. Man kann Frames benutzen, um dadurch eine Ordnung zu schaffen, dann kann man Frames per pack oder grid anordnen und innerhalb der Frames die andere Methode benutzen.

Variablen werden generell klein geschrieben. Aller direkt ausführbarer Code muß in Funktionen stehen, die Hauptfunktion heißt üblicherweise `main`.
`command=lambda: root.quit()` ist kurz `command=root.quit` und `command=lambda: None` ist quatsch und kann weg.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Weitere Anmerkungen zum Quelltext: `sys` und `json` werden importiert aber nicht verwendet. Das Modul `datetime` wird importiert, kann aber gar nicht verwendet werden, weil kurz danach `datetime` *aus* `datetime` importiert wird, und damit das Modul ersetzt.

Konstanten schreibt man KOMPLETT_GROSS.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Was auch immer `lefty` sein sollte — es wird nirgends verwendet. `screen_width` und `screen_height` werden ebenfalls definiert und dann nicht verwendet. Ebenso `cbreite` wo das `c` auch Fragen aufwirft die es nicht sollte: was bedeutet das? Namen sollten keine kryptischen Abkürzungen enthalten.

Namen sollten auch nicht nummeriert werden. Dann will man entweder bessere Namen, oder gar keine einzelnen Namen/Werte sondern eine Datenstruktur. Oft eine Liste. Im Falle der `label*` aber *gar keine* Namen, denn es macht überhaupt gar keinen Sinn `None` an so viele nummerierte Namen zu binden.

Die `ipady`-Werte bei den `grid()`-Aufrufen machen einen komischen Eindruck. Warum sind die alle anders?

Man sollte auch keine Fenstergrössen und -positionen vorgeben. Benutzer hassen das wenn Fenster nicht dort aufgehen wo Platz ist, sondern sich in die Mitte drängeln.

Ausrichten von Leerzeichen ist unüblich. Das macht nur unnötig Arbeit wenn sich was an der Länge des längsten Namens ändert und zieht dann ”Änderungen” nach sich die gar keine inhaltlichen, sondern nur kosmetische Änderungen sind, was man in Diffs dann aber erst einmal herausfinden muss.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Chorum
User
Beiträge: 7
Registriert: Sonntag 9. Januar 2022, 18:21

Das sind ja mal allerhand Anmerkungen für meinen ersten Python Code.

Es waren allerhand "Leichen"enthalten, da ich einiges probiert habe.
Die Anmerkungen zu den Konventionen werde ich beachten.

Ich denke mal ich werde mich mit Frames und dem Grid auseinandersetzen um weiterzukommen.

Vielen Dank für die ausführlichen Kommentare zum Python Code vom ersten Python Tag :)

Chorum
Antworten