Seite 1 von 2
Elemente in der Canvas plazieren
Verfasst: Mittwoch 18. November 2020, 18:56
von KlausP
Hallo,
mir gelingt es mit tk im Fenstermodus Buttons, sowie Ein- und Ausgaben einigermassen zu plazieren.
Habe die Fenstergrösse ermittelt und dann die xy - Positionen versucht im Verhältnis vorzugeben:
Das klappte auch im Ansatz; würde mir vielleicht schon genügen.
Die Grid - Methode ist ja m.E. fraglich, wenn auch noch ein Listenfeld eingebettet werden soll.
Meine Versuche, das Programm per Canvas abzubilden, sehen allerdings mehr als traurig aus.
Die Elemente landen an "unmöglichsten" Orten.
Ich erwarte auch keineswegs keine perfekte Unterweisung, sondern nur Hinweise,
wie ich z.B. benamte Editierfelder und Buttoms einigermassen arrangieren kann.
Und Listenfelder incl. Scrollbar z.B. im mittleren 2/3 der vertikalen Auflösung,
sodass restliche Felder und Knöpfe sich ober- bzw. unterhalb plazieren lassen.
Hier ist der Code, de ich versucht habe:
Code: Alles auswählen
[code]# from tkinter import Tk, Canvas, Button, Label, Scrollbar
from tkinter import *
class MyButton(Button):
def action1 (self):
f_namen = open('E:\\namen.txt', 'a')
name = eingabe.get()
print (name)
liste.insert(END, name)
f_namen.write(name)
f_namen.write("\n")
eingabe.delete (0, 'end')
def action2 (self):
#print (var.get())
print ("dummy")
def info():
canvas.delete("info")
info_w_text = canvas.create_text(w- h/800 * 100, 10, anchor="nw", fill="darkblue", tag = "info", text="Breite: " + str(w))
info_h_text = canvas.create_text(w- h/800 * 100, 40, anchor="nw", fill="darkblue", tag = "info", text="Höhe : " + str(h))
root.after(500, info)
def exit():
root.destroy()
root = Tk()
# Canvas nach Bildschirm einstellen
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(0) # (0) eröffnet als Fenster
canvas = Canvas(root, width=w, height=h, background="white")
canvas.pack(fill='both', expand=True)
f_namen = open('E:\\namen.txt', 'r')
inhalt_namen = f_namen.readlines()
widget = Label(canvas, text="Geben Sie Ihren Namen ein: ")
widget.place(x=w/20 + w/1000 * 70, y =h-40)
widget.pack()
canvas.create_window(300, 250, window = widget)
#canvas.create_window(x =(w/20 + w/1500) * 70, y =h-40, window = widget)
eingabe = Entry(widget, bd =2, width = 22)
eingabe.pack()
# button1 = MyButton(Button, text="Eingabe", bg="yellow", command=action1).place(x=w/20, y =h-80)
button1 = MyButton(canvas, text = "Eingabe", bg="yellow")
button1 ["command"] = button1.action1
button1.place(x=w/20 +w/1500 * 40, y =h-800)
button1.pack()
#var = IntVar()
#checkbutton = Checkbutton (canvas, text = "Bestätigen", variable = var)
#checkbutton.place(x=w/20 + w/1500 * 40, y =h-80)
#checkbutton.pack()
button2 = MyButton(root, text = "Ein/Aus")
button2.place(x=w/20 + w/1500 * 80, y =h-800)
button2 ["command"] = button2.action2
button2.pack()
button3 = Button(canvas, text="Exit", bg="silver", command=exit)
button3.place(x=w/20 +w/1500 * 120, y =h-800)
scrollbar = Scrollbar(canvas)
liste = Listbox(root, yscrollcommand = scrollbar.set, width=30)
liste.config(font=("Arial", 12))
liste.place(x=w/20 + w/1500 * 20, y =h-400)
liste.pack()
for zeile in inhalt_namen:
liste.insert(END, zeile)
f_namen.close()
scrollbar.config(command=liste.yview)
scrollbar.place(x=w/20 + w/1500 * 500, y =h-400)
scrollbar.pack(fill = "y")
root.mainloop()
[/code]
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 18. November 2020, 19:00
von KlausP
Sorry:
Wen ich sagte "erwarte", dann erhoffe ich nur Hinweise.
Habe in Foren auch gute Hinweise gefunden - aber unterm Strich stehe ich immer noch vor einem simplen "to do"
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 18. November 2020, 20:06
von __blackjack__
@KlausP: Da ist einiges falsch an dem Code. Vergiss `place()` und verwende `grid()` und `pack()` für das Layout.
Ansonsten ist da ziemlich vieles komisch bis falsch in dem Quelltext. Zum Beispiel das Du sehr oft `place()` *und* `pack()` auf den selben `Widget`-Objekten aufrufst.
Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Das bedeutet auch das alles was Funktionen und Methoden ausser Konstanten benötigen als Argument(e) übergeben wird. Deswegen ist bei GUI-Programmierung in der Regel auch objektorientierte Programmierung (OOP) gefragt, also eigene Klassen.
Aber dann auch *echte* und nicht so etwas komisches, sinnfreies wie `MyButton` wo die Methoden gar keine Methoden sind, sondern einfach nur zwei Funktionen für zwei unterschiedliche `Button`-Objekte die da sinnfrei in eine Klasse gesteckt wurden.
Die Leerzeichensetzung ist ziemlich willkürlich und entspricht nicht dem
Style Guide for Python Code.
`overrideredirect()` braucht man nicht zum ”abschalten” aufrufen wenn man das nicht vorher aktiviert hat.
Bei den Widgets ist extrem uneinheitlich was die jeweils als Elternwidget haben. Und ein `Label` als Elternwidget eines `Entry` ist falsch.
`info()` wird nicht benutzt, es wäre aber auch ziemlich unsinnig zweimal in der Sekunde die gleiche statische Information auf einem `Canvas` anzuzeigen in dem man den alten Text löscht und neuen Text anlegt. Dieses ständige löschen und erzeugen von Elementen auf einem `Canvas` ist unnötig aufwändig. Da würde man einmal die beiden Textelemente anlegen und dann einfach nur deren Inhalt ändern. Sofern man denn Informationen hat die sich auch ändern.
Den Pfadnamen zu der Textdatei sollte man nur einmal im Quelltext stehen haben, als Konstante.
Beim erweitern der Datei wird die Datei nicht wieder geschlossen. Beim einlesen wird sie zwar geschlossen aber ewig weit weg von dem Punkt an dem nichts mehr mit der Datei gemacht wird. Am besten öffnet man Dateien zusammen mit der ``with``-Anweisung und beschränkt den Block auf das nötigste.
Textdateien sollte man immer explizit mit einer Kodierung öffnen.
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 18. November 2020, 20:13
von Sirius3
Man benutzt keine *-Importe, weil man sich damit unkontrolliert hunderte Namen in den eigenen Namensraum schaufelt. Die Klasse MyButton ist komplett unsinnig, da sie gar keinen Zustand hat, und action1 und action2 daher auch self gar nicht nuzten.
Wenn man kompliziertere Layouts umsetzen will, dann muß man Frames mit pack oder grid schachteln. Wie soll denn Dein Fenster aussehen?
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 19. November 2020, 13:23
von KlausP
@ Sirius und _blackjack_
Danke für eure Kommentare.
MyButton und einigen Code habe ich aus einem Buch entnommen.
Für mich ist es ja zunächst ein mehr oder weniger zweites Übungsobjekt auf der Leinwand, welche nun eine Scroll-Liste einbetten sollte.
Die Listausgabe benötige ich tatsächlich in einem anderen Programm, welches im Moment per Terminal Ausgabe läuft.
Die Scroll-Liste könnte z.B. links stehen und rechts untereinander Ein- Ausgabefelder oder Buttons, um z.B. einen Pfad zu wählen oder Daten zu korrigieren.
Ich hab da noch keine zu festen Vorstellungen.
Soll am Ende Freude bereiten und ein wenig Sinn machen.
Ich war früher auf der Pascal Schiene zugange mit einer recht guten eigenen Unit incl. Assembler.
Ein Locate eines Ein- Ausgabefeldes mit Kontrolle der erlaubten Character war da gar kein Problem.
Dass das place() hier nicht wie erwartet funktioniert und sich wohl auch mit grid() und pack() nicht (richtig) verträgt, habe ich schon erlebt, aber noch nicht richtig verinnerlicht. Dachte, ich könnte die Plazierung irgendwie überlisten.
Den Vorschlag einer Text- und/oder Grafikausgabe auf der Canvas mittels "widget" habe ich irgendwo, ich denke aus diesem Forum übernommen.
Eltern widget: dazu habe ich im Moment "keine Ahnung"
Ich möchte ja nur auf dieser Leinwand Info oder Daten ausgeben bzw. eingeben. Jedes einfache Mittel wäre mir da am Anfang recht.
Ein Übungsbeispiel aus einem Buch macht es simpel - Vier große Buttons:
- Produkt anzeigen
- Produkt erfassen
- Produkt löschen
- Preis ändern
und verzweigt dafür in einzelne Module.
Sternchen - Importe böse:
Ist sicherlich richtig; Habe aber z.B. eine Weile gebraucht zuerkennen, dass ich "Button" nicht importiert hatte.
Wenn alles (hoffentlich) läuft, sollte wirklich nur benötigtes importiert werden.
" `overrideredirect()` braucht man nicht zum ”abschalten” aufrufen wenn man das nicht vorher aktiviert hat."
Beim Einsatz des Programmes auf dem Tablet will ich ja wohl kein Fenster.
Bei der Entwicklung auf dem PC ist der Fenstermodus aber recht praktisch, um ein fehlerhaftes Programm zu stoppen, oder?
Strg-Alt-Del ist mir das zu doof.
'info()' stammt aus einem anderen Übungsobjekt.
Sollte mir zum Test Info geben über die Größe der Canvas bei PC und Tablet.
Hatte ja versucht, mit Hilfe dieser Info die Elemente zu plazieren.
Das war mir auch in einer einfachen Anwendung mit 3 Buttons am unteren Bereich einigermassen gelungen.
Klar braucht die info nicht regelmässig refreshed zu werden. Aber wie ich das machen soll mit "info" austauschen, ist mir nicht recht klar.
Habe getestet, dass entsprechend Refresh erfolgt, wenn root.after (zeit, command) in der Mainloop() - Schleife verwendet wird.
Button - Commands werden ja wohl in der Mainloop - Schleife auch laufend gepollt.
Wann und wie wird denn eine Info nur einmal ausgegeben.
Idents:
Also, ob nun einige Idents 4 oder zufällig auch mal 5 Blanks aufweisen, ist mir eigentlich schnuppe.
Vielleicht hast du bessere Augen, oder kannst ein Problem benennen ?
Der Style Guide zeigt im wesentlichen 4 blanks und empfiehlt z.B zusätzliche Idents bei Logik wie
"wenn nicht a
dann b"
Das ist schon ok; aber wo ist das Problem?
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 19. November 2020, 14:19
von peterpy
Hallo KlausP,
Wenn alles unordentlich aussieht, liegt es vielleicht daran, dass Du keine Ahnung von Eltern Widgets hast.
Das Root Widget ist das UrUrGrosselternwidget. in dieses platzierst Du Frames, in die Frames Labels, Entrys, Canvases oder Buttons, auf die Buttons Bilder. In die Canvases Graphik, Bilder, Text, Buttons....
Und jedes Widget ist ein Kind von einem Elternwidget, ausser root.
Skizzier doch grob auf, was Du wo haben willst. Arrangier die Widgets in einem oder mehreren Frame.
Frames und deren Widgets lassen sich mit grid gut arrangieren. Sollte sich ein Feld mal über mehrere Zeilen und oder Spalten erstrecken, grid kennt auch columnspan und rowspan.
Gruss Peter
https://effbot.org/tkinterbook/
https://anzeljg.github.io/rin2/book2/24 ... /grid.html
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 19. November 2020, 16:00
von __blackjack__
@KlausP: Mir ist nicht so wirklich klar warum Du da ein `Canvas` verwendest. Das macht nicht wirklich Sinn an dieser Stelle und ist sehr ungewöhnlich. Und auch auf dem Tablet will man ein Fenster haben. Oder nicht Python verwenden. Oder zumindest nicht Tk.
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 19. November 2020, 16:50
von KlausP
Hi Peter,
das stimmt.
Über Widgets bin ich erst gestolpert, als ich versuchte, Ein-Ausgaben auf der Canvas zu gestalten.
Im Forum hat mir mal jemand geraten, in Zusammenhang mit einem Programm, welches auch auf einem Tablet laufen soll, keine Windows zu gestalten:
Klang so wie "verwendest du etwa Fenster und Frames?"
Die "Frames" habe ich wohl fälschlicherweise hereininterprätiert.
Innerhalb von Frames kann ich ja wohl mit grid() viel struktiriertes anfangen.
Vielen Dank für deinen guten strukturellen Ansatz.
Meine 2 Einsteigerlehrbücher gehen leider nur auf das fensterorientierte Umfeld ein.
Habe ja auch schon vieles brauchbare zusammengegoggelt.
Leider schein ich das leider alles falsch zu vermixen. Will jetzt mal einen einfachen GUI Start hinbekommen.
Dein zweiter Link gibt ja gute Hinweise.
Dazu bitte 2 einfachste? Fragen:
1) wenn von GUI die Rede ist, dann heißt das, dass der Interpretor nicht die Ausgaben übernehmen soll.
Muss ich dann zwingend eine Canvas z.B. in eine Frame einbetten, auf der die Aus, bzw. Eingabe erfolgt?
2) Falls ich z.B. auf dem rechtseitigen Rahmen, im vertikalen Grid (2) von 3 folgendes ein/ausgeben möchte:
text="Gib deinen ein: " inp_name = Entry (???, db= 2, width =20)
.... nach logischer Prüfung, z.B. Ausgabe an gleicher Stelle:
message
message_text = c.create_text (text= "ist gelogen; dein richtiger Name lautet: ", echt_name)
Danke und Grüsse, Klaus
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 19. November 2020, 17:16
von KlausP
@ _blackjack_
Will ja nur mal wieder mit einer moderneren Sprache als dem uralten Pascal ein paar mehr oder weniger simple Mathe bzw. grafische Geschichten probieren.
Ohne GUI mit der Interpretor - Ausgabe geht es ja schon recht gut; auch wenn ich noch etliche logische Fehler mache.
Hatte dich mal so verstanden, dass Fenster auf einem Tablet nicht angesagt sind, bzw. nicht wirklich funktionieren.
Meine auch, nie auf dem Tablet die Steuerelemente für "Fenster/Ganzen Bildschirm/unten ablegen" gesehen zu haben.
Mein falscher Eindruck war, es müsse alles auf die Canvas.
Meine einzige Anwendung derzeit beinhaltet Logik und gibt dann per "print" eine Wortliste heraus. Beides läuft ohne alle Frames per Windows bzw. auf dem Tablet.
Nun wollte ich statt der Konsolenausgabe im ersten Schritt die Liste als scrollbare Liste ausgeben.
Vielleicht im Rahmen dieser Anwendung ein paar Wörter separat erfassen.
Also ein wenig wie Scroll-Liste links und rechts etwas "grün" drumherum.
.... ein wenig rumspielen, verstehen - danke für deine Kommentare und mich verbessern.
Will auch keine perfekte Grafik hinbekommen; TK sollte genügen, nach meinem derzeitigen Stand.
Python finde ich als Sprache schon recht ansprechend; ich möchte mich auch gerne darin ein wenig vertiefen.
Tiefes Verstehen würde vllt. recht oder zu lange dauern.
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 19. November 2020, 19:19
von KlausP
Hallo @ all.
Habe meine Testanwendung mal in ein frame_left und ein frame-right zerlegt.
Darin könnte ich ja mit grid() auch einiges arrangieren.
Die Scroll-Bar funktioniert auch. - Auch auf dem Tablet.
Die Scrollbar nutzt allerdings den Frame bei weitem nicht vertikal aus.
Habe gelesen, dass man grid() nutzen soll und Ankerpunkte wie "NE" o.ä. festlegen.
Klingt etwas seltsam ... werd ich testen. Oder habt ihr eine bessere Idee?
Anderer Punkt:
Bei Windows hab ich z.B. eine hor. Auflösung von 2560 Punkten.
Bei einer Skalierung von 175% auf dem Win-Schirm zeigt Python auch richtigerweise eine Breite von 1463 an.
Habt ihr eine Idee, wie man beim Wechsel auf das Tablet auf Basis dieser Relationen die Anwendung per z.B. Schriftgröße auch einigermassen automatisch anpassen könnte?
Re: Elemente in der Canvas plazieren
Verfasst: Freitag 20. November 2020, 12:48
von peterpy
Hallo KlausP,
wenn von GUI die Rede ist, dann heißt das, dass der Interpretor nicht die Ausgaben übernehmen soll.
Das kannst Du handhaben wie Du willst, es ist aber nicht sinnvoll, eine funktionierende Anwendung zusammen mit der Konsolenausgabe laufen zu lassen, nur um die Ausgaben zu sehen.
Falls ich z.B. auf dem rechtseitigen Rahmen, im vertikalen Grid (2) von 3 folgendes ein/ausgeben möchte:
Code: Alles auswählen
#!/usr/bin/env python3 -u
# -*- coding: utf-8 -*-
import tkinter as tk
from functools import partial
def gui(ausgabe=''):
root= tk.Tk()
variable_texteingabe = tk.StringVar()
variable_textausgabe = tk.StringVar()
rahmen_links = tk.Frame(root, bd=5, bg="yellow", height=200, width=300)
rahmen_links.grid(column=0, row=0)
rahmen_mitte = tk.Frame(root, bd=5, bg="lightblue", height=200, width=100)
rahmen_mitte.grid(column=1, row=0)
tk.Label(rahmen_mitte, width=25, bd=5, relief="groove", pady=5,
text="Bitte einen Namen eingeben").grid(column=0, row=0, padx=5,)
eingabefeld = tk.Entry(rahmen_mitte, width=25, bd=5, relief="ridge",
textvariable=variable_texteingabe, bg='white')
eingabefeld.grid(column=0, row=1, pady=5)
ausgabefeld = tk.Label(rahmen_mitte, width=25, bd=5,
text=ausgabe, textvariable=variable_textausgabe,
height=4, bg = "lightgrey")
ausgabefeld.grid(column=0, row=2, padx=5,)
taste_ausgabe=tk.Button(rahmen_links, width=25, bd=5,
command=partial(eingabe_pruefen,
variable_texteingabe,
variable_textausgabe, ausgabefeld),
text="Eingabe\nprüfen")
taste_ausgabe.grid(column=0, row=0)
root.mainloop()
def eingabe_pruefen(variable_texteingabe, variable_textausgabe, ausgabefeld):
eingegeben=variable_texteingabe.get()
if eingegeben == "ABC":
text = "{}\n{}\n{}".format("Die Eingabe", eingegeben, "ist richtig")
farbe="lightgreen"
else:
text="{}\n{}\n{}".format("Die Eingabe", eingegeben, "ist falsch")
farbe="orange"
ausgeben=variable_textausgabe.set(text)
ausgabefeld.config(bg=farbe)
if __name__ == "__main__":
gui()
verwendest du etwa Fenster und Frames?
Natürlich, das rootfenster und Frames im rootfenster und wenn nötig die "kurzlebenden" Toplevelwidgets.
Für mich ist es ja zunächst ein mehr oder weniger zweites Übungsobjekt auf der Leinwand, welche nun eine Scroll-Liste einbetten sollte.
Schau dir mal die Listbox an.
Gruss
Peter
Re: Elemente in der Canvas plazieren
Verfasst: Montag 23. November 2020, 12:12
von KlausP
Hi Peter,
ich komme erst jetzt dazu, mir dein Beispiel näher anzusehen.
Vielen Dank dafür!
Zwei Kommentare habe ich dazu:
1. der linke Frame ist per height=200, width=300 definiert. Python nutzt aber offensichtlich nur die Breite des Buttons.
Ist das normal?
Wodurch definiert sich die Höhe des Buttons?
2. die Funktion "partial" ersetzt wohl irgendwie die übergebenen Variablen der aufgerufenen Funktion von links nach rechts.
Richtig verstanden habe ich das aber noch nicht.
geht das nicht einfacher; bzw. unkomplizierter?
Gruß, Klaus
Re: Elemente in der Canvas plazieren
Verfasst: Montag 23. November 2020, 12:52
von __blackjack__
@KlausP: Ad 2. Nein, das geht nicht einfacher. Ereignisbasierte GUI-Programmierung hat halt diese Komplexität und man muss entweder Klassen oder Closures drauf haben, am besten beides.
Re: Elemente in der Canvas plazieren
Verfasst: Montag 23. November 2020, 13:55
von peterpy
Hallo KlausP,,
die Höhe der Buttons wird in Anzahl Zeilen angegeben, die Breite in Anzahl Zeichen, also je nach Schrift verschieden.
Die zweite Frage hat dir schon __blackjacK__ beantwortet.
https://anzeljg.github.io/rin2/book2/24 ... index.html
Re: Elemente in der Canvas plazieren
Verfasst: Dienstag 24. November 2020, 16:30
von KlausP
hi peterpy, blackjack
Nun habe ich mein Programm successive immer mehr an Peters "Demo" angepasst,
weil ... in meiner Version Probleme aufliefen.
( Der Knopf benötigte "partial", damit das Programm wartete; und die Var StringVar( ) benötigten root.
Dann wurde 'ausgabe' nicht erkannt - diese var steckte in der def gui (ausgabe = "") )
Im Unterschied zu Peters Proggi, habe ich die variable_texteingabe als eing_must benannt,
und entsprechend die variable_textausgabe.
Irgendwie werden diese Variablen nicht erkannt und ich verstehe nicht, warum,
Wollte eigentlich allein zurechtkommen; aber nach Stunden häng ich nun immer noch ratlos fest.
Peter,
in der Funktion "eingabe prüfen", finde ich am Ende die Zuordnung "ausgeben = variable_textausgabe.set(text)"
Aber "ausgeben" ist nirgendswo definiert.
Verstehen tu ich das nicht wirklich.
Danke für euren Support mal wieder.
Gruß, Klaus
Code: Alles auswählen
#compare_gui-5t.pu 2020-1124
import tkinter as tk
from functools import partial
def gui(ausgabe = ''):
#fenster = Tk()
root = tk.Tk()
eing_must = tk.StringVar()
ausg_must = tk.StringVar()
# w, h = root.winfo_screenwidth(), root.winfo_screenheight()
# root.overrideredirect(0) # (0) eröffnet als Fenster
# fenster.geometry("%dx%d+0+0" % (w, h))
size = w * h
# geom = str(int(w/2)) + "x" + str(int(h/2))
root.geometry("1200x800")
#root.title("Wörter finden")
rahmen = tk.Frame(root, relief="ridge", borderwidth=3, height=600, width=1000)
rahmen.pack(fill = "both", expand = 1)
frame_left = tk.Frame(rahmen, width=100, height =700, relief="ridge", borderwidth=3)
frame_left.grid(column=0, row=0)
frame_mid = tk.Frame(rahmen, relief="ridge", borderwidth=3,
height=600, width=300)
frame_mid.grid(column=1, row=0)
frame_right = tk.Frame(rahmen, width=300, height =600, relief="ridge", borderwidth=3)
frame_right.grid(column=2, row=0)
labl_eg_must = tk.Label(frame_mid, width = 30, bd=5, pady=5,
text="vorg. Buchstaben eingeben").grid(column=1, row=0, padx=5)
feld_eg_must = tk.Entry(frame_mid, width=30, bd=5, relief="ridge",
textvariable = eing_muster, bg='white')
feld_eg_must.grid(column=1, row=1, pady=5)
feld_ag_must = tk.Label(frame_mid, width=25, bd=5,
text=ausgabe, textvariable = ausg_muster,
height=1, bg = "white")
feld_ag_must.grid(column=1, row=3, padx=5)
taste_prf = tk.Button(frame_mid, width = 25, bd=3,
command = partial(must_prf,
eing_must, ausg_must, feld_ag_must),
text = "Muster prüfen")
taste_prf.grid(column=1, row=2, pady=5, padx=5)
root.mainloop()
def must_prf (eing_must, ausg_must, feld_ag_must):
eingegeben = eing_muster.get()
ausgabe = eingegeben.upper()
# input_muster.delete(0,'end')
# .delete klappt mit "Entry - Eingabe, aber nicht mit anderer Variablen
farbe="lightgreen"
ausgeben=ausg_must.set()
labl_ag_must.config(bg=farbe)
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 25. November 2020, 07:33
von Sirius3
Bitte benutze keine kryptischen Abkürzungen. Was soll Erdgeschoss oder Aktiongesellschaft in diesem Zusammenhang denn bedeuten?
Die Bedeutung von must ist mir völlig schleierhaft, so dass ich überhaupt nicht verstehe, was eine Funktion mit Namen must_prf denn machen soll. Mit set will man was setzen. Ohne Parameter und mit Rückgabewert macht das keinen Sinn.
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 25. November 2020, 08:39
von peterpy
Hallo KlausP,
wie schon Sirius3 erwähnt hat, die Namen sollten einen Bezug zu deinem Code haben.
pipifax kann auch ein Name sein, aber was soll der bedeuten?
Wie schreibst Du und testet Du deinen Code?
Die einfachste IDE ist Idle und bei Python mit dabei.
Ich frage, weil dein Code Fehler ausgibt.
Der erste Fehler: Name w ist nicht definiert.
Der zweite Fehler: Name eing_muster ist nicht definiert
Ich weiss nicht wo Du Idle3 in Windows findest. Ich nutze dieses BS nicht.
in der Funktion "eingabe prüfen", finde ich am Ende die Zuordnung
ausgeben = variable_textausgabe.set(text)
Die Zeile kannst Du auch ohne Zuweisung an den Namen schreiben, das funktioniert auch so.
Ich habs nur an den Namen gebunden, damit Du auch verstehst was das set soll.
Üblich wäre ein Kommentar, aber nicht für so triviale Befehle...
Gruss Peter
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 25. November 2020, 10:32
von KlausP
Hallo Team,
habe 2 oder 3 Fehler gefunden.
Der Kommentar hat sich erstmal erledigt.
Gruß, Klaus
Re: Elemente in der Canvas plazieren
Verfasst: Mittwoch 25. November 2020, 19:12
von KlausP
Hi Peter,
ich hatte den Fokus auf "mein Prog war fast wie deins, aber lief nicht"
Für die Präsentation hier hatte ich einige Zeilen rausgeworfen - leider blieben da Fehler übrig.
und Deklarationen, die nicht sprechend waren.
Sorry ... ich wollte ja eigentlich mein Posting löschen, ging aber nicht mehr.
Sollte wohl mal beim nächsten Prob. einen neuen Thread anfangen.
Danke für deine Kommentare.
Super, euer Support; bin echt ganze Schritte vorangekommen mit der Gui.
Ist aber immer noch eine Herausforderung.
Bis denne, Klaus
Re: Elemente in der Canvas plazieren
Verfasst: Donnerstag 26. November 2020, 19:15
von KlausP
@ Peter,
eigentlich wollte ich mein Posting ja rückgängig machen, weil ich meine Fehler gefunden hatte.
Aber das ging dann nicht mehr:
Hatte ja auch gesagt: bitte Posting vergessen.
Ich programmiere in einer Windows Python Shell (3.8.6).
Die macht Syntax Prüfung und verweist auf die Zeilen mit entsprechendem Kommentar.
Wenn das Programm in Win läuft kopiere ich den Code ins Android Tablet, wo ich Pydroid installiert habe.
Dort gibt es natürlich Abweichungen und wenns ein tiefgestelltes "\n" hinter den Textzeilen bzw. Elementen in einer Liste ist.
(hab ich im Code mit rstrip("\n") unterdrückt)
Variablen wie w, h.
Wenn sie per "w, h = root.winfo_screenwidth(), root.winfo_screenheight()" ermittelt werden
und gleich am Programmanfang die Geometrie setzen, dann erübrigen sich m.E. lange Variablennamen,
da im späteren Programm kaum Bezüge auftreten.
Ich geb aber zu:
sprechende lange Variablennamen sind nicht 100pro mein Fokus.
Wichtiger finde ich inzwischen zu kommentieren, was ein Programmcode wo und weshalb tut.
Im Moment habe ich mein Projekt zumindest erfolgreich ans laufen gebracht.
Übergabe von Variablen oder Werten an andere Module macht mir immer noch viel Mühe.
Da ist viel "try 'n error" mit bestimmt nicht optimierten Code.
Aber so eine Gui mit strukturierten Programmblöcken braucht schon eine Lernphase.
Ich denke, ich möchte jetzt diesen langen Thread beenden. Das Thema passt ja auch nicht mehr ganz.
Bei weiteren Fragen würd ich ein neues Tema anfangen.
Solltet ihr kommentieren wollen: gerne.
noch hier?
oder in einer direkten Mail?
Wünsche euch noch einen schönen Abend
Klaus