2014-11-03 19 views
0

我的問題是,我正在嘗試在tkinter中進行一個數學測驗,要求輸入一個名稱,然後使用randint函數選擇一個問題。該人輸入一個答案,點擊提交,應用程序迴應是否正確或錯誤。Python tkinter,使用隨機生成的問題進行測驗,每次提交後重置

問題出現在我希望程序在提交後明確問題和答案,並提出新的問題3次以上(每次添加到最後顯示的分數)後,但是我似乎無法找到一種方法來輕鬆做到這一點;我目前一直在嘗試一段時間循環,但它不工作。

所以我的問題是我怎麼會讓代碼循環的部分3次每次都問不同的問題?

我的代碼迄今:

from tkinter import*;from random import randint 

class Tk_app(Frame): 
    def __init__(self, root): 
     super(Tk_app, self).__init__(root);self.grid();self.createElements() 
    def nameElements(self): 
     self.NmLbl = Label(self, text="Name:").grid(row=0) 
     self.Name = Entry(self);self.Name.grid(row=0, column=1);self.score = int(0) 
    def createElements(self): 
     Frame.grid_forget(self) 
     self.QNum = randint(1, 2) 
     self.QEnt = Entry(self);self.QEnt.grid(row=1, column=1) 
     if(self.QNum == 1): 
      self.QLbl = Label(self, text="What is the air speed velocity of a flying swallow?").grid(row=1) 
      self.a = "African or European?" 
     elif(self.QNum == 2): 
      self.QLbl = Label(self, text="What is your quest?").grid(row=1) 
      self.a = "To find the holy grail." 
     else: 
      self.QLbl = Label(self, text="What is your favourite colour?").grid(row=1) 
      self.a = "Green" 
     def submit(self): 
      FinNam = self.Name.get() 
      Ans = self.QEnt.get() 
      if(Ans == self.a): 
       AnsLbl = Label(self, text = "Well done you got it right, "+FinNam).grid(row=2, column=1) 
       self.score+=1 
      else: 
       AnsLbl = Label(self, text = "Sorry not this time, "+FinNam+" The answer was " + self.a).grid(row=2, column=1) 
     self.SBut = Button(self, text="submit", command=lambda:submit(self)).grid(row=2) 


root = Tk();root.title("Monty Questions") 
app = Tk_app.nameElements(root) 
fin = int(0) 
while(fin<3): 
    fin+=1 
    app2 = Tk_app.createElements(root) 

root.mainloop() 
+0

不定義一個變量和'.grid()'它在同一行上,因爲它會返回'Nonetype'。你必須把它放在下一行。 – W1ll1amvl 2014-11-04 00:13:48

回答

1

你不想讓自己的應用類之外的while循環。當程序運行時,它應該在用戶與之交互之前調用root.mainloop(),並保持這種狀態直到完成。此代碼的一般結構不正確。

在Tkinter的我只有這個類定義之外:

root = Tk() 
root.title("Monty Questions") 
app = Tk_app() 
root.mainloop() 

然後設置你所有的Tk部件和諸如此類的東西在init

class Tk_app(Frame): 
    def __init__(self, root): 
     Frame.__init__(root); 
     self.grid(); 
     self.createElements() 
     self.nameElements() 

最後,如果您只是將submit()定義爲Tk_app的成員函數,而不是作爲嵌套函數定義li如果你有它,你不需要使用lambda函數來傳遞self。只要做到:

class Tk_app(): 

    ... __init__ and other things... 

    def createElements(self): 
     ... some code ... 
     self.SBut = Button(self, text="submit", command=self.submit).grid(row=2) 

    def submit(self, Event): 
     ... submit code ... 

Event是必要的,因爲不僅submit傳遞self,因爲所有的成員函數,它也被傳遞觸發它的調用該事件。

這可能不會讓你一路暢通,但希望能幫助你構建你的代碼,使Tkinter能夠正常工作。查看示例,尤其是this one,瞭解如何構建代碼。探索該網站,你應該瞭解Tkinter的氛圍。

+0

好的,謝謝你的幫助。我將添加並調整我的代碼並在將來記住它。 – minigregg 2014-11-04 21:48:20