Allgemeine Fragen zu Tkinter

Fragen zu Tkinter.
Antworten
heiliga horsd

Hallo,

ich mache zur Zeit erste Gehversuche mit tk und habe mir ein kleines Beispielprogramm geschrieben:

Code: Alles auswählen

import tkinter
import tkinter.scrolledtext


def test(): # Test-Funktion
    try:
        entry_text = (number_entry.get())
        entry_text = float(entry_text)
        widget_solution.insert("end", entry_text)
        widget_solution.insert("end", "\n")
        number_entry.delete(0, "end")
        number_entry.insert(0, "")
    except ValueError:
        widget_solution.insert("end", "Bitte eine ZAHL eingeben")
        widget_solution.insert("end", "\n")
        number_entry.delete(0, "end")
        number_entry.insert(0, "")

main = tkinter.Tk() # Hauptfenster
# In diesem Frame werden Werte mit entry-Widgets entgegen genommen
frame_value = tkinter.Frame(main, relief = "sunken") 
frame_value.pack()
# In diesem Frame werden (später einmal) Einstellungen verändert
frame_settings = tkinter.Frame(main, relief = "ridge")
frame_settings.pack(fill = "both")
# Dieses Widget dient der Ausgabe
widget_solution = tkinter.scrolledtext.ScrolledText(main, height = 10)
widget_solution.pack(anchor = "s")
# In diesem Widget werden Werte eingegeben
number_entry = tkinter.Entry(frame_value)
number_entry.pack()
# Dieser Button sorgt dafür, dass die Test-Funktion aufgerufen wird
button_anzeigen = tkinter.Button(frame_settings, text = "anzeigen",
                                     command = test)
button_anzeigen.pack()
# Endlosschleife
main.mainloop()
Nun dazu folgende Fragen:
1. Wie kann ich im Entry-Widget einen grauen Text anzeigen, der sobald ich rein klicke verschwindet? (Wie bspw. bei der Windows-Anmeldung)
2. Wie kann ich bei einem Kommandoaufruf per Button (also bspw. command=foo) der Funktion foo einen/mehrere Parameter übergeben?
3. Sollte ich auf etwas bestimmtes achten, mache ich was falsch (im Hinblick auf die Qualität/Lesbarkeit des Codes)?

Ich bin noch relativ unerfahren mit Tkinter, ich wäre sehr erfreut wenn man darauf Rücksicht bei der Antwort nehmen würde :oops:

Lg HH
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo heiliga horsd

Hier etwas zum experimentieren für Events mit Parameter-Übergabe:

Code: Alles auswählen

import tkinter as tk
from functools import partial

def button_partial_event(parm1, parm2, *args):
    """Aufruf mit partial"""
    print ("Partial-Call parm1 = %d, parm2 = %d" % (parm1, parm2))
    print("*args = ", args)
    print()

def button_lambda_event1(event, parm1, parm2):
    """Aufruf mit lambda"""
    print ("Lambda-Call-1! parm1 = %d, parm2 = %d" % (parm1, parm2))
    print ("Widget-Object =", event.widget)
    print()

def button_lambda_event2(parm1, parm2):
    """Aufruf mit lambda"""
    print ("Lambda-Call-2! parm1 = %d, parm2 = %d" % (parm1, parm2))
    print()

app_win = tk.Tk()
app_win.geometry("150x180")
app_win.configure(bg='steelblue')

arg1 = 1
arg2 = 2

button1 = tk.Button(app_win, text="1-Partial-Call!", command=partial(
    button_partial_event, arg1, arg2))
button1.pack(pady=1, fill='x')

button2 = tk.Button(app_win, text="2-Partial-Call!")
button2.pack(pady=1, fill='x')
button2.bind('<Button-1>', partial(button_partial_event, arg1, arg2))

button3 = tk.Button(app_win, text="3-Partial-Call!", command=
    lambda argument1=arg1, argument2=arg2:
    button_partial_event(argument1, argument2))
button3.pack(pady=1, fill='x')

button4 = tk.Button(app_win, text="4-Lambda-Call2!", command=
    lambda argument1=arg1, argument2=arg2:
    button_lambda_event2(argument1, argument2))
button4.pack(pady=1, fill='x')

button5 = tk.Button(app_win, text="5-Lambda-Call1!")
button5.pack(pady=1, fill='x')
button5.bind('<Button-1>', lambda event, argument1=arg1, argument2=arg2:
    button_lambda_event1(event, argument1, argument2))

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
heiliga horsd

Hallo wuf,

erst einmal Danke für den Code, zumindest weiß ich jetzt wie ich Parameter übergebe.

Nun haben sich jedoch auch noch weitere Fragen zu den vorhandenen ergeben:
1. Wie kann ich im Entry-Widget einen grauen Text anzeigen, der sobald ich rein klicke verschwindet? (Wie bspw. bei der Windows-Anmeldung)
2. Was ist "partial"?
3.

Code: Alles auswählen

app_win.geometry("150x180")
Ist dieser Wert absolut oder ändert er sich auch je nach Inhalt? Bisher hatte ich nämlich immer das Problem, dass sich Python recht wenig um die Größe schert und eher auf den Inhalt achtet (was mir zwar vorher auch bekannt war, aber doch teilweise nervig ist)
4. Sollte ich auf etwas bestimmtes achten, mache ich was falsch (im Hinblick auf die Qualität/Lesbarkeit des Codes)?
BlackJack

1. Da müsstest Du Dir aus einem `Text`-Widget am besten mit einer eigenen Klasse ein Widget schreiben, dass sich so verhält.
2. http://docs.python.org/library/functool ... ls.partial
3. Das mit der Grösse habe ich nicht verstanden!? Tkinter schert sich um die Grösse des Inhalts. Wie kann so etwas nervig sein? Was ist denn die Alternative? GUIs die man nicht bedienen kann, weil der Programmierer meinte bei *ihm* auf dem Rechner reicht der Platz für alle Widgets, dann muss das auch überall anders so sein. Ist es aber nicht.
4. Mir ist da zu viel Code auf Modulebene. Und man kann daran jetzt nicht erkennen, wie gut Du mit objektorientierter Programmierung vertraut bist -- das sollte man IMHO können und anwenden, wenn man GUIs programmiert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo heiliga horsd

Code: Alles auswählen

app_win.geometry("150x180"
Bestimmt absolut die Geometrie (Breite & Höhe) des Hauptfensters. Kannst du natürlich weglassen.
heiliga horsd hat geschrieben:Wie kann ich im Entry-Widget einen grauen Text anzeigen, der sobald ich rein klicke verschwindet? (Wie bspw. bei der Windows-Anmeldung)
Mit reinklicken meinst du die linke Maustaste?
Mit welcher Farbe möchtest du das nach dem Klick ins Entry-Widget geschreibene anzeigen? Ich nehme einmal an das grau wird durch schwarz ersetzt?

Gruss wuf :wink:
Take it easy Mates!
heiliga horsd

@Blackjack:
1. Da bin ich sicherlich noch zu weit unten in der Erfahrungsebene! :(
2. Danke, das habe ich jetzt so halb verstanden (glaube ich)
3. OK, hab ich nicht bedacht, Danke für den Hinweis!
4. Ich weiß schon was das ist und kann auch mit Klassen, Vererbung etc. (auch wie das in Python konkret aussieht) arbeiten, aber ich wüsste da beim oberen Beispiel nix konkretes, was sich da groß objektorientierter Schreiben ließe - kläre mich bitte auf!
@wuf:
Danke für die Info
Also, ich hab das Widget, da steht z.B. grau "Zahl eingeben", und wenn ich dann mit der linken Maustaste reinklicke verschwindet der Text und ich kann in Schwarz ganz normal rein schreiben. Ist die Beschreibung in Ordnung?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo heiliga horsd

Kannst du das einmal ausprobieren?:
http://paste.pocoo.org/show/172589/

Gruss wuf :wink:
Take it easy Mates!
heiliga horsd

Super, das ist genau das richtige! Vielen Dank! *freu* :P
Steht nur noch
4. Ich weiß schon was das ist und kann auch mit Klassen, Vererbung etc. (auch wie das in Python konkret aussieht) arbeiten, aber ich wüsste da beim oberen Beispiel nix konkretes, was sich da groß objektorientierter Schreiben ließe - kläre mich bitte auf!
offen.

Lg heiliga horsd
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo heiliga horsd

Hier eine Annäherung deines Skriptes an OOP. Kann natürlich noch verbessert und verfeinert werden:
http://paste.pocoo.org/show/172620/

Gruss wuf :wink:
Take it easy Mates!
heiliga horsd

Danke dir!
Ich muss leider ganz ehrlich gestehen, dass mir das meiner Meinung nach beim aktuellen Umfang des Programms nix gebracht hat - der Code ist nicht viel leserlicher (gut, der Großteil davon wurde 1:1 kopiert, aber unabhängig davon sieht es IMHO nicht viel anders aus) und Geschwindigkeitsvorteile habe ich vermutlich auch nur vernachlässigbare. Auf Dauer denke ich bringt mir aber oop schon was (muss ich zugeben).
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

..... Stimmt natürlich schon. Für deine relativ kleine Anwendung bringt es nicht viel. Aber sollte die Anwendung wachsen wirst du eines Tages sehen was mit OOP erreicht werden kann. Ich würde mich aber auf jeden Fall suksessive in OOP einarbeiten.

Viel Spass!

Gruss wuf :wink:
Take it easy Mates!
heiliga horsd

Ich werde mir den Ratschlag bei meinen künftigen Programmen auf jeden Fall zu Herzen nehmen, Danke nochmals!
Antworten