【问题标题】:StringVar() from JSON list using pop() - Python / tkinter [closed]使用 pop() 的 JSON 列表中的 StringVar() - Python / tkinter [关闭]
【发布时间】:2015-05-30 13:01:10
【问题描述】:

我正在尝试使用 tkinter for Python 创建一个基本的测验程序。现在我正在尝试从 JSON 文件中的两个字典列表中加载一个问题:

[
{
"wrong3": "Nope, also wrong",
"question": "Example Question 1",
"wrong1": "Incorrect answer",
"wrong2": "Another wrong one",
"answer": "Correct answer"
},
{
"wrong3": "0",
"question": "How many good Matrix movies are there?",
"wrong1": "2",
"wrong2": "3",
"answer": "1"
}
]

我正在尝试创建一个函数来从列表中提取字典,方法是通过索引遍历字典,然后使用 pop() 将其从列表中删除。然后我尝试使用 stringVar() 将问题放在标签中无济于事!

我假设我的问题出在 pop() 方法上,但我不确定如何继续。我应该从 pop() 继续并尝试其他方法吗?

import tkinter
import tkinter.messagebox
import json
import random




class ProgramGUI:

    def __init__(self):

        try:
            f = open('question.txt', 'r')
            questions = json.load(f)
            f.close()

        except FileNotFoundError:
            tkinter.messagebox.showerror('Missing/Invalid file')
            command=self.main.destroy
            return


        score = 0


        self.main = tkinter.Tk()
        self.main.title('Quizbox')

        self.mainFrame = tkinter.Frame(self.main, width=350, height=150, bg="green", padx=20, pady=20)
        self.mainFrame.pack(side="top")

        #Question
        self.questionString = tkinter.StringVar()
        self.questionBox = tkinter.Label(self.mainFrame, justify="center", bg="grey",
                                             wraplength=300, pady=10, textvariable=self.questionString)
        self.questionBox.pack(side="top")

        #Frames
        self.frame1 = tkinter.Frame(self.mainFrame, bg="white", pady=5)
        self.frame2 = tkinter.Frame(self.mainFrame, bg="white")
        self.frame1.pack(fill="x")
        self.frame2.pack(fill="x")

        #Buttons (Yet to be completed)
        self.answer1 = tkinter.Button(self.frame1, text="Answer 1")
        self.answer1.pack(side="left")
        self.answer2 = tkinter.Button(self.frame1, text="Answer 2")
        self.answer2.pack(side="left")
        self.answer3 = tkinter.Button(self.frame1, text="Answer 3")
        self.answer3.pack(side="left")
        self.answer4 = tkinter.Button(self.frame1, text="Answer 4")
        self.answer4.pack(side="left")

        buttonList = []
        buttonList.append(self.answer1)
        buttonList.append(self.answer2)
        buttonList.append(self.answer3)
        buttonList.append(self.answer4)


        #Score
        self.scoretext = tkinter.Label(self.frame2, width=20, justify="right", text="Score:" )
        self.scorecount = tkinter.Label(self.frame2, width=20, text="0", bg="white")
        self.scoretext.pack(side="left", fill="y")
        self.scorecount.pack(side="left")




        self.loadQuestion(questions)
        tkinter.mainloop()




    def loadQuestion(self):
        quest = questions[i]['question']
        self.questionString.set(quest)

【问题讨论】:

    标签: python json dictionary tkinter


    【解决方案1】:

    pop 不是那样工作的。

    array.pop(n) 接受一个整数参数 n,并返回并从列表中删除第 n 个项目。如果可能,最好只删除最后一项,以避免重新索引列表。 Document link

    questions[i]['question'] 
    

    返回问题的文本,而不是整数。

    但是因为没有必要从列表中删除问题。而是

    def loadQuestion(self,i)
        """Load the ith question and set in in the stringVar
        questionString""""
        quest = questions[i]['question']
        self.questionString.set(quest)
    

    每次更新问题时都会调用此方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多