Seite 1 von 1
closed
Verfasst: Montag 13. September 2010, 20:54
von Noobie
Guten Abend,
folgendes Minimalbeispiel macht mir Probleme:
Code: Alles auswählen
from Tkinter import *
class MainApplication:
def __init__(self, master):
# Menue -----------------------------------------------------------------
mainmenu = Menu(master)
master.config(menu = mainmenu)
filemenu = Menu(mainmenu)
mainmenu.add_cascade(label = "File", menu = filemenu)
filemenu.add_command("Import", command = Import("Test-textt")) # fehlerhaft
# Events ----------------------------------------------------------------
def Import(text): # fehlerhaft
print text # fehlerhaft
root = Tk() # TopLevel-Widget
root.title("GUI")
root.geometry("500x100")
app = MainApplication(root)
root.mainloop()
Habt Ihr generell Tipps, wie ich das besser angehen könnte / das Problem lösen kann. Der Fehler (soweit ich als Tkinter-Neuling das beurteilen kann) liegt in den Zeilen 10 bzw. 13+14 (gekennzeichnet)
Danke Euch schonmal
Re: Frage: Menü mit Funktion versehen
Verfasst: Montag 13. September 2010, 21:09
von BlackJack
@Noobie: "Fehlerhaft" ist kein gute Fehlerbeschreibung. Ich schätze doch mal ganz stark Du bekommst hier eine Ausnahme. Das müsste ein `NameError` sein. Wo soll denn `Import` in Zeile 10 herkommen? Falls Du die "Methode" an der Stelle meinst, fehlt da noch der Bezug auf das Objekt selbst. Allerdings ist die Methode keine Methode, denn das erste Argument ist bei Methoden immer eine Referenz auf das Objekt selbst, und das soll ja nicht `text` heissen. Wäre ziemlich ungewöhnlich. Konventionell heisst das `self`.
Wenn das alles stimmen würde, dann müsste `Import()` aber eine Funktion oder zumindest etwas Aufrufbares zurückgeben, denn Du bindest in Zeile 10 ja den *Rückgabewert* von einem *Aufruf* von `Import()` an das `command`-Argument. Da möchtest Du vielleicht ein Aufrufbares Objekt mit einem gebundenen Argument mittels `functools.partial()` erzeugen. Oder eine ``lambda``-Funktion erstellen.
Insgesamt würde ich empfehlen GUI-Programmierung solange zur Seite zu legen bis Du objektorientierte Programmierung mit Python drauf hast.
Re: Frage: Menü mit Funktion versehen
Verfasst: Montag 13. September 2010, 21:22
von Noobie
BlackJack hat geschrieben:Insgesamt würde ich empfehlen GUI-Programmierung solange zur Seite zu legen bis Du objektorientierte Programmierung mit Python drauf hast.
Mhh, ich bin ein Learning-by-doing-Typ

OOP is nicht das Thema (C++/Java), aber Python bin ich relativ unbewandert...
Was ich erreichen wollte: durch drücken des Menü-Eintrags sollte der beispieltext auf meiner Shell ausgegeben werden.
Falls du in etwa verstehst, was ich meine, wäre ich über nen Code-Schnipsel sehr dankbar

Re: Frage: Menü mit Funktion versehen
Verfasst: Montag 13. September 2010, 21:28
von BlackJack
@Noobie: Ich schrob ja auch nicht allgemein OOP sondern OOP mit Python. Du musst halt schon lernen wie man in Python eine Methode definiert und wie man von einer Methode eine andere Methode auf dem selben Objekt aufruft. Das sollte im Tutorial in der Dokumentation stehen. Learning by doing wäre in diesem Fall also das Tutorial mal durcharbeiten.
Re: closed
Verfasst: Montag 13. September 2010, 21:51
von Noobie
Tutorials find ich nur bedingt gut - je nach Qualität...
Dank Dir trotzdem für deinen Hinweis.
Problem gelöst - Thread kann zu
Re: closed
Verfasst: Dienstag 14. September 2010, 13:23
von wuf
Hallo Noobie
Willkommen in unserem Forum. Du bist nicht alleine ich gehöre auch zu den 'learn by doing' Typen. Hier habe ich dein Skript noch ein bisschen angepasst und PEP 8 einfliessen lassen:
Code: Alles auswählen
import Tkinter as tk
class MainApplication:
def __init__(self, master):
# Menue -----------------------------------------------------------------
mainmenu = tk.Menu(master)
master.config(menu=mainmenu)
filemenu = tk.Menu(mainmenu)
mainmenu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="Import",
command=lambda : self.my_import("Hallo Noobie"))
# Events ----------------------------------------------------------------
def my_import(self, text):
print "Mein Test-Text", text
root = tk.Tk() # TopLevel-Widget
root.title("GUI")
root.geometry("500x100")
app = MainApplication(root)
root.mainloop()
Gruß wuf

Re: closed
Verfasst: Donnerstag 16. September 2010, 16:54
von Noobie
Wunderbar. Habs zwar dann auch selbst gelöst (war ja nicht so arg viel falsch für den ersten Versuch), aber ich bin immer froh über ein paar Zeilen Code von freundlichen Helfern, die mehr von der Materie verstehen als ich. Gerade auf gültige Konventionen hab ich noch nicht geachtet. War mir erst mal wichtiger, dass das Ding irgendwie läuft. Mit kleinen Erfolgserlebnissen zwischendurch machts mehr Spass
Danke dir, wuf
