Programm startet nur aus IDLE

Fragen zu Tkinter.
Antworten
yeti
User
Beiträge: 8
Registriert: Dienstag 3. November 2009, 23:35

Hallo zusammen,

das unten angehängte Programm kann ich unter IDLE starten (leider wird es dort auch nicht sauber beendet), aber aus der cmd in Windows startet es gar nicht, ich habe also auch keine Fehlermeldungen, die mir weiterhelfen könnten.

Für Hinweise wäre ich sehr dankbar.

Zum Code noch zwei Erläuterungen: der tkSimpleDialog ist aus "An Introduction to Tkinter" von Lundh. Ich habe einige Unicode-Strings gelöscht, um den Code übersichtlicher zu halten

Code: Alles auswählen

# -*- coding: utf-8 -*-

from Tkinter import *
import tkSimpleDialog

ButtonText1 = { 'de':u'...',
                      'el':u'...',
                    }
ButtonText2 = { 'de':u'...',
                      'el':u'...',
                    }

ButtonText3 = { 'de':u'...',
                     'el':u'...',
                   }

ButtonText4 = ...

class MainDialog:

    def __init__(self, parent):

        self.myParent = parent
        self.myFrame = Frame(parent, width=100, height=100)
        self.myFrame.pack()
        self.country = ""
        self.myFrame.bind_all("<Key-Return>", self.printCountry)
        self.myFrame.bind_all("<Key>", self.setEntry)
        s = Button(self.myFrame, text="Set Language", command=self.setLanguage)
        s.pack()
        
    def setButtons(self, language):
        self.nr = 1
        for i in buttonTexts:
            self.b = Radiobutton(self.myFrame, text=i[language], variable=v, value=self.nr, indicatoron=0)
            self.b.pack()
            self.nr += 1

    def printCountry(self, event):
        print str(self.country) + " " + str(v.get())
        self.country = ""

    def setEntry(self, event):
        self.country += event.char

    def setLanguage(self):
        sd = SelectionDialog(root)

class SelectionDialog(tkSimpleDialog.Dialog):

    def body(self, master):
        
        MODES = [
            (u'...', 'de'),...
                ]

        sv.set("de") # initialize

        for text, mode in MODES:
            b = Radiobutton(master, text=text, variable=sv, value=mode)
            b.pack(anchor=W)

    def apply(self):
        self.language = sv.get()

root = Tk()
v = IntVar()
md = MainDialog(root)

root.withdraw()
sv = StringVar()
sd = SelectionDialog(root)
md.setButtons(sd.language)
root.deiconify()

root.mainloop()
root.destroy()
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Nachdem ich die Syntaxfehler ausgemerzt habe, erhalte ich diesen Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 73, in <module>
    md.setButtons(sd.language)
  File "test.py", line 34, in setButtons
    for i in buttonTexts:
NameError: global name 'buttonTexts' is not defined
Du solltest immer lauffähigen Code posten, der dein Problem beschreibt und nicht gleich alles posten.

Und wiese startet das nicht aus der cmd? Und benutze anstatt IDLE lieber einen vernünftigen Editor (wie zum Beispiel Scite).

Am Ende soll natürlich der obligatorische Hinweis auf die PEP-8 nicht fehlen :).
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
yeti
User
Beiträge: 8
Registriert: Dienstag 3. November 2009, 23:35

Danke für die Hinweise, da war ich wohl ein bisschen übereifrig beim rauskürzen! Ich habe jetzt versucht, soweit wie möglich alles rauszuschmeissen, was kein Problem macht und trotzdem lauffähigen Code zu behalten. Der folgende Code läuft bei mir, wie gesagt, so unter IDLE und zeigt die GUI an, in cmd gestartet passiert allerdings nichts.

Code: Alles auswählen

# -*- coding: utf-8 -*-

from Tkinter import *

buttonText1 = { 'de':u'bla',
                      'el':u'blub',
                    }
buttonText2 = { 'de':u'bla',
                      'el':u'blub',
                    }

buttonTexts = (buttonText1, buttonText2)

class MainDialog:

    def __init__(self, parent):

        self.myParent = parent
        self.myFrame = Frame(parent, width=100, height=100)
        self.myFrame.pack()
        self.country = ""
        self.myFrame.bind_all("<Key>", self.setEntry)
       
    def setButtons(self, language):
        self.nr = 1
        for i in buttonTexts:
            self.b = Radiobutton(self.myFrame, text=i[language], variable=v, value=self.nr, indicatoron=0)
            self.b.pack()
            self.nr += 1

    def setEntry(self, event):
        self.country += event.char

root = Tk()
md = MainDialog(root)

md.setButtons('de')

root.mainloop()
root.destroy()

Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Zeile 41 ist sinnlos.
Und: Auch das ist kein lauffähiger Code. Wo kommt das v in Zeile 28 her?

Wieso schaffst du es noch nicht einmal, Code zu zeigen, der solche groben Schnitzer nicht enthält? Hättest es doch wenigstens einmal starten können, bevor du es postest ...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hat IDLE irgendwelche magischen Features, die ich nicht kenne?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
yeti
User
Beiträge: 8
Registriert: Dienstag 3. November 2009, 23:35

numerix, Danke für den Hinweis, die letzte Zeile werde ich dann rausnehmen. Ich verstehe, dass Du Dich ärgerst, aber bei mir läuft der Code so wie ich ihn gepostet habe - wenn ich ihn aus IDLE starte.
yeti
User
Beiträge: 8
Registriert: Dienstag 3. November 2009, 23:35

numerix, welche Fehlermeldungen erhälts Du denn, wenn Du den Code, wie ich ihn gepostet habe, ausführen willst. Vielleicht gibt mir das ja den Hinweis, warum es bei mir unter cmd gar nicht läuft.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

numerix hat geschrieben:Zeile 41 ist sinnlos.
Und: Auch das ist kein lauffähiger Code. Wo kommt das v in Zeile 28 her?

Wieso schaffst du es noch nicht einmal, Code zu zeigen, der solche groben Schnitzer nicht enthält? Hättest es doch wenigstens einmal starten können, bevor du es postest ...
@yeti: Das ``v`` ist nicht definiert.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo yeti

Bei mir wirft dein skript als erstes folgende Exception:

Code: Alles auswählen

  File "prg_start_with_idle_01.py", line 18
    ButtonText4 = ...
                  ^
SyntaxError: invalid syntax
Bezieht sich auf die unvollständige Zeile Nr.18

Gruss wuf :wink:
Take it easy Mates!
yeti
User
Beiträge: 8
Registriert: Dienstag 3. November 2009, 23:35

Danke wuf, da hast Du wahrscheinlich die erste Version genommen, oder. In der zweiten geposteten sind keine solchen Ellipsen mehr drin.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Also ein bisschen kreatives Engagement kann yeti doch wohl verlangen. :)
Wenn man die 2. Version nimmt und erstmal statt
variable=v
variable=None
schreibt, funktioniert es sowohl in der Shell als auch mit Idle.
(Ist aber ein ziemlich kleines Fenster.)
Zeile 41 gehoert natuerlich auch geloescht.

:wink:
yipyip
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

yeti hat geschrieben:numerix, Danke für den Hinweis, die letzte Zeile werde ich dann rausnehmen. Ich verstehe, dass Du Dich ärgerst, aber bei mir läuft der Code so wie ich ihn gepostet habe - wenn ich ihn aus IDLE starte.
Dann kann es nur daran liegen, dass das "v" (Z. 28 ) vorher irgendwann einmal im globalen Namensraum angelegt wurde. Da IDLE sich das (je nach Einstellung) während einer Sitzung merkt, kann es tatsächlich passieren, dass der Code bei dir noch läuft, obwohl er für sich genommen nicht lauffähig ist. Wenn du IDLE einmal schließt (komplett mit allen zugehörigen Fenstern) und neu startest, läuft er auch bei dir nicht mehr ...

Vermutlich sind solche "ungewollten Reste" auch der Grund, warum es "in IDLE startet" und ansonsten nicht.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo yeti

Hier deine zweite Variante (ohne Lupe bedienbar):

Code: Alles auswählen

# -*- coding: utf-8 -*-

from Tkinter import *

buttonText1 = { 'de':u'bla',
                      'el':u'blub',
                    }
buttonText2 = { 'de':u'bla',
                      'el':u'blub',
                    }

buttonTexts = (buttonText1, buttonText2)

class MainDialog:

    def __init__(self, parent):

        self.myParent = parent
        self.myFrame = Frame(parent, width=100, height=100)
        self.myFrame.pack(expand='yes', fill='both')
        self.country = ""
        self.myFrame.bind_all("<Key>", self.setEntry)
        self.variabe = IntVar()

    def setButtons(self, language):
        self.nr = 1
        for i in buttonTexts:
            self.b = Radiobutton(self.myFrame, text=i[language],
                variable=self.variabe, value=self.nr, indicatoron=0)
            self.b.pack(expand='yes', fill='both')
            self.nr += 1

    def setEntry(self, event):
        self.country += event.char

root = Tk()
root.geometry('200x100')

md = MainDialog(root)

md.setButtons('de')

root.mainloop()
Gruss wuf :wink:
Take it easy Mates!
yeti
User
Beiträge: 8
Registriert: Dienstag 3. November 2009, 23:35

Vielen Dank, jetzt klappt's.


Und sieht gut aus, Danke wuf.
Antworten