Seite 1 von 1

Programm startet nur aus IDLE

Verfasst: Dienstag 3. November 2009, 23:47
von yeti
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()

Verfasst: Mittwoch 4. November 2009, 00:27
von jbs
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 :).

Verfasst: Mittwoch 4. November 2009, 09:32
von yeti
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()


Verfasst: Mittwoch 4. November 2009, 10:02
von numerix
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 ...

Verfasst: Mittwoch 4. November 2009, 11:15
von jbs
Hat IDLE irgendwelche magischen Features, die ich nicht kenne?

Verfasst: Mittwoch 4. November 2009, 11:33
von yeti
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.

Verfasst: Mittwoch 4. November 2009, 12:52
von yeti
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.

Verfasst: Mittwoch 4. November 2009, 13:13
von jbs
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.

Verfasst: Mittwoch 4. November 2009, 14:08
von wuf
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:

Verfasst: Mittwoch 4. November 2009, 14:16
von yeti
Danke wuf, da hast Du wahrscheinlich die erste Version genommen, oder. In der zweiten geposteten sind keine solchen Ellipsen mehr drin.

Verfasst: Mittwoch 4. November 2009, 14:30
von yipyip
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

Verfasst: Mittwoch 4. November 2009, 15:03
von numerix
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.

Verfasst: Mittwoch 4. November 2009, 16:01
von wuf
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:

Verfasst: Mittwoch 4. November 2009, 17:46
von yeti
Vielen Dank, jetzt klappt's.


Und sieht gut aus, Danke wuf.