closed

Fragen zu Tkinter.
Antworten
Noobie
User
Beiträge: 4
Registriert: Montag 13. September 2010, 20:44

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
Zuletzt geändert von Noobie am Montag 13. September 2010, 21:50, insgesamt 1-mal geändert.
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.
Noobie
User
Beiträge: 4
Registriert: Montag 13. September 2010, 20:44

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 :lol: 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 :)
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.
Noobie
User
Beiträge: 4
Registriert: Montag 13. September 2010, 20:44

Tutorials find ich nur bedingt gut - je nach Qualität...
Dank Dir trotzdem für deinen Hinweis.

Problem gelöst - Thread kann zu
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
Noobie
User
Beiträge: 4
Registriert: Montag 13. September 2010, 20:44

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 :-)
Antworten