Problem mit Klassen bzw. Instanzierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Montag 21. Januar 2008, 23:07

Ich habe folgendes Problem

Ich weiss nicht ob das überhaupt geht, aber es dürfte doch möglich sein eine Klasse in einer Funktion einer anderen Klasse zu instanzieren.

Bekomme da leider immer die Fehlermeldung:
NameError: global name 'question' is not defined

Hier mal der komplette Code.

Die Datei q.py

Code: Alles auswählen

class q():
    def __init__(self, question, c1, c2, c3, c4, correct):
        self.question = question
        self.c1 = c1
        self.c2 = c2
        self.c3 = c3
        self.c4 = c4
        self.correct = correct
        
[/code]

Und die Datei, die darauf zugreift:

Code: Alles auswählen

#!/usr/bin/env python

""" Testprogramm SilentQuiz - mit wxwidgets """

import wx, shelve, random
from q import q

class BaseAskQDia(wx.Dialog):
	def __init__(self):
		wx.Dialog.__init__(self, None, -1, 'Ask Question', size=(300, 200))
		TestText = wx.StaticText(self, -1, question.question, (20, 20))
		okButton = wx.Button(self, wx.ID_OK, "OK", pos=(20, 160))
		okButton.SetDefault()
		cancelButton = wx.Button(self, wx.ID_CANCEL, "Cancel", pos=(130, 160))

class MyFrame(wx.Frame):
	def __init__(self):
		wx.Frame.__init__(self, None, -1, "SilentQuiz", size=(260, 115))
		p = wx.Panel(self)
		
		self.button1 = wx.Button(p, -1, "Ask Question", pos=(20, 20))
		self.Bind(wx.EVT_BUTTON, self.AskQDia, self.button1)
		self.button1.SetDefault()
		
		self.button2 = wx.Button(p, -1, "New Question", pos=(130, 20))
		self.Bind(wx.EVT_BUTTON, self.NewQDia, self.button2)
		self.button2.SetDefault()

		self.button3 = wx.Button(p, -1, "Edit Question", pos=(20, 60))
		self.Bind(wx.EVT_BUTTON, self.EditQDia, self.button3)
		self.button3.SetDefault()
		
		self.button4 = wx.Button(p, -1, "Show Question", pos=(130, 60))
		self.Bind(wx.EVT_BUTTON, self.ShowQDia, self.button4)
		self.button4.SetDefault()
		
	def AskQDia(self, event):
		qbase = shelve.open('Fragen.qz')
		k = '1'
		
		while qbase.has_key(k):
			ck = int(k)
			ck = ck + 1
			k = str(ck)
		else:
			ck = int(k)
			lk = ck - 1
			
		quekey = random.randint(1, lk)
		quekey = str(quekey)
		question = qbase[quekey]
		AskQuestion = BaseAskQDia()
		result = AskQuestion.ShowModal()
	def NewQDia(self, event):
		print "Not implemented yet"
	def EditQDia(self, event):
		print "Not implemented yet"
	def ShowQDia(self, event):
		print "Not implemented yet"



if __name__ == "__main__":
	app = wx.PySimpleApp()
	frame = MyFrame()
	frame.Show()
	app.MainLoop()
Es geht um den Aufruf von question.question in der Klasse BaseAskQDia
Das ganze wird ein Ratespiel mit shelve und wxpython.
Komme leider an diesem Punkt nicht weiter.
Bin für jeden Ansatz dankbar...

Danke im vorraus
Silentpolygon
BlackJack

Montag 21. Januar 2008, 23:17

In `BaseAskQDia` benutzt Du ein globales `question` ohne dass das definiert wäre. Einfachste Lösung: als Argument an die `__init__()` übergeben.
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Montag 21. Januar 2008, 23:33

Also erstmal einen großen Ritterorden für die wahrscheinlich schnellste Forenantwort.

Danke. Hat funktioniert. Bin leider noch nicht so bewandert ion Sachen Klassen.

Vielen Dank
Gruß
Silentpolygon
Antworten