Seite 1 von 1

Problem mit Klassen bzw. Instanzierung

Verfasst: Montag 21. Januar 2008, 23:07
von silentpolygon
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

Verfasst: Montag 21. Januar 2008, 23:17
von BlackJack
In `BaseAskQDia` benutzt Du ein globales `question` ohne dass das definiert wäre. Einfachste Lösung: als Argument an die `__init__()` übergeben.

Verfasst: Montag 21. Januar 2008, 23:33
von silentpolygon
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