如何更新小部件?

时间:2015-02-27 15:29:27

标签: python tkinter

我正在为我的学校项目做一个简单的问答游戏,我在程序执行期间更新小部件时遇到了一些麻烦。这是may程序的一部分(我知道这不是真正的智能代码,但到目前为止它有效):

EuQuestionFrame=Frame(root)
EuQuestionFrame.pack()

question=['question1', 'question2']

        a=['20 273', 'aa']         #Possible answers: first question-first column and second question-second column
        b=['19 732', 'bb']
        c=['21 327', 'cc']
        d=['20 372', 'dd']
number=0

class Questions:
        def question(self):
            q=Label(frame, text=question[number], font=('Arial Black', '14')).pack()           #Here program writes questions that I listed before.

        def answers(self):
            def correct():
                number=+1

            #Here I want to update all widgets to question 2, in that way I will change number value.

            def incorrect():
                print('incorrect')

            x=[correct, incorrect]    #Correct answers for first and second questions - one column for each question. Compare with possible answers I listed before. 
            y=[incorrect, correct]
            z=[incorrect, incorrect]
            v=[incorrect, incorrect]

            a1= Button(EuQuestionFrame, text=a[number], width=10, activebackground='orange',
                       cursor="circle", command=x[number])
            a1.pack()
            a2= Button(EuQuestionFrame, text=b[number], width=10, activebackground='orange',
                       cursor="circle", command=y[number])
            a2.pack()
            a3= Button(EuQuestionFrame, text=c[number], width=10, activebackground='orange',
                       cursor="circle", command=z[number])
            a3.pack()
            a4= Button(EuQuestionFrame, text=d[number], width=10, activebackground='orange',
                       cursor="circle", command=v[number])
            a4.pack()

是否有更新小部件的功能(如果是,如何使用它)?我在努力工作,但由于缺乏编程知识,我无法找到解决方案。

1 个答案:

答案 0 :(得分:0)

我已经完成了这一切,你需要做的就是编辑字典,因为我已经指示添加更多问题;如果您有任何疑问,请对其进行评论。它已准备就绪:

from Tkinter import * #Tkinter; If you are using 3.x, change to tkinter, emphasis on all lowercase
from ttk import Frame, Style #You need this for the frame and style;
import random
class Questions(Frame):

    def __init__(self, parent):
            global root
            global question
            global corinc
            global number
            global a
            global b
            global c
            global d
            global qA
            global curbutton
            global ques#Current Question to be asked
            global inc#Incorrect tally
            global cors#Correct tally
            global qnumber#Number of current question
            global qnum

            question=StringVar()
            question.set('Question 1')#Current Question Label Textvariable

            a=StringVar()
            b=StringVar()
            c=StringVar()
            d=StringVar()

            corinc=StringVar()
            corinc.set('')#Displays Correct or Incorrect, At first displays nothing
            number=0#Number of Question - 1
            #number=random.randint(0, len(curbutton)-1 #UNCOMMENT THIS to make selection random

            qA={'What Is 5068.25 x 4?' : 'a', 'Which answer has an average of 5?' : 'c'}
            ##Put questions in format 'question' : 'properanswerbuttontoclick'; see above example

            curbutton={1: 'a:20 273b:19 732c:21 327d:20 372', 2: 'a:1,2,3,4,5b:1,2,3,4,5,6c:3,4,5,6,7d:1,0,2,9,3'}
            ###^^^Put options in format questionnumber : 'a:firstoptionb:secondoptionc:thirdoptiond:fourthoption'!
            ###Otherwise, this will not work properly!

            ques=StringVar()
            inc=0
            cors = 0
            qnumber=1
            qnum=StringVar()

            self.parent = parent
            Frame.__init__(self, parent)
            #Binding Goes here; eg parent.bind('<Return>, fun.ction)
            self.initUI()

    def new_question(self):
        ques.set(qA.keys()[number])#qA.keys()[number] gets the key at the location number in the Dictionary qA
        a.set(str(list(curbutton[number+1].split('a:')[1].split('b:'))[0]))#These Grab the values for the key number+1, and display the PROPERLY FORMATTED results
        b.set(str(list(curbutton[number+1].split('b:')[1].split('c:'))[0]))#on the buttons
        c.set(str(list(curbutton[number+1].split('c:')[1].split('d:'))[0]))
        d.set(str(list(curbutton[number+1].split('d:'))[1]))
        qnum.set(str(number)+'/' + str(len(curbutton)))#Displays questionnumber/totalquestions
        self.update_idletasks

    def initUI(self):
        global corinc
        global a1
        global a2
        global a3
        global a4

        self.parent.title("Quiz")
        self.style = Style()
        self.style.theme_use("clam")
        self.new_question()#Sets the button and answer values
        q=Label(textvariable=question)#Question Number
        q.pack()
        aq=Label(textvariable=ques)#Question being asked
        ci=Label(textvariable=corinc)#Displays Correct or Incorrect
        ci.pack()
        aq.pack()

        a1= Button(textvariable=a, width=10, bg='orange',
                   cursor="circle", command= lambda: self.check('a'))#lambda allows you to pass a function with arguments, e.g. self.check('a') instead of self.check
        a1.pack()#                                                   #It must be there if you are passing arguments
        a2= Button(textvariable=b, width=10, bg='orange',
                   cursor="circle", command= lambda: self.check('b'))
        a2.pack()
        a3= Button(textvariable=c, width=10, bg='orange',
                   cursor="circle", command= lambda: self.check('c'))
        a3.pack()
        a4= Button(textvariable=d, width=10, bg='orange',
                   cursor="circle", command= lambda: self.check('d'))
        a4.pack()
        qnumb=Label(textvariable=qnum)#displays qnum, see line 46
        qnumb.pack()

    def correct(self):
        global cors
        global number
        cors = cors+1#Adds to correct tally
        number=number+1#changes question number
        #number=random.randomint(number, len(curbutton))
        corinc.set('Correct')#displays correct
        self.update_idletasks#UPDATES ALL WIDGETS
        question.set('Question ' + str(number+1))#Sets question number e.g. Question 1
        global qnumber
        qnumber=qnumber+1
        if qnumber == len(curbutton):
            qnumber=len(curbutton)
        qnum.set(str(number)+'/' + str(len(curbutton)))#See line 62
        self.update_idletasks#Updates
        try:
            self.new_question()#Calls New question function
        except IndexError:#If it raises the error IndexError, it means there are no more q/a's listed and it will direct to
            self.quiz_complete()#Completion 'Page'

    def quiz_complete(self):
        question.set('Quiz Complete')
        corinc.set('Correct: ' + str(cors) + '\nIncorrect: ' + str(inc))#Take a guess
        ques.set('')
        a.set('Quit')
        a1.configure(command=self.quitq)
        b.set('Take Quiz Again')
        a2.configure(command=self.restart)
        c.set('')
        d.set('')
        self.update_idletasks

    def restart(self):
        self.update_idletasks
        global number
        corinc.set('')
        question.set('Question 1')
        a1.configure(command= lambda : self.check('a'))
        a2.configure(command= lambda : self.check('b'))
        global cors
        cors=0
        global inc
        inc=0
        number=0
        #number=random.randint(0, len(curbutton)-1)
        self.new_question()
    def incorrect(self):
        global inc
        inc=inc+1#adds to incorrect tally
        corinc.set('Incorrect')
        self.update_idletasks
    def check(self, awn):
        if awn==qA.values()[number]: self.correct()#This checks if the value at location number matches the correct answer given on the qA dict
        else: self.incorrect()#^^
    def quitq(self):
        quit()

def main():
    global root
    root = Tk()
    #root.iconbitmap(default='Drive:/Pythonpath/icon.ico')#Wont work for me but you can try it
    root.geometry("300x200+100+100")#In format widthxheight+distancefromtop+distancefromleftside
    app = Questions(root)
    root.mainloop()

main()