StringVar()tkinter条目小部件中的错误

时间:2014-04-25 20:11:53

标签: python python-3.x tkinter

到目前为止,我已经返回并修复了一段代码。 这是一个产生问题的数学游戏;问这个问题;检查它并添加到分数。 我仍然是一个初学者,有一个问题,我看到很多人都有问题。 虽然我仍然无法弄清楚

我有一个条目小部件,想要从中获取信息,但仍然会出现错误

某人有什么不对,在哪里放v = StringVar()以及为什么错(我想了解原因)

这是一款WIP游戏,请忽略其他错误。     将tkinter导入为tk     随机导入为r

score = 0
a = 0
b = 0
answer = 0

def question_gen():
    global a
    global b
    global answer
    a = r.randint(0,100)
    b = r.randint(0,100)
    answer = (a+b)

def question_checker():
    global score
    user_input = v.get
    if user_input == answer:
        score += 1
    else:
        score += 0

class Demo1:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master).pack()
        self.label = tk.Label(self.frame, text = 'Welcome To My Wonderful Math Game\n\nHow To Play\n\nWhen you pick a difficulty a new window will pop up\nYou have to answer to the question\nBefore the timer runs out\n\nGood Luck!').pack()
        self.button1 = tk.Button(self.frame, text = 'Easy', width = 25, command = self.new_window).pack()
        self.button2 = tk.Button(self.frame, text = 'Hard', width = 25, command = self.new_window).pack()

    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = Demo2(self.newWindow)

class Demo2:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master).pack()
        self.label = tk.Label(self.master, text = '{0} + {1} ='.format(a,b)).pack()
        self.entry = tk.Entry(self.master, textvariable=v).pack()
        self.quitButton = tk.Button(self.master, text = 'Quit', width = 25, command = self.close_windows).pack()
    def close_windows(self):
        self.master.destroy()

def main(): 
    root = tk.Tk()
    app = Demo1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

  

v = StringVar()放在哪里?

您必须将v存储在可以到达的地方

  1. at entry widget instanciation
  2. 问题检查员
  3. 可能的解决方案包括

    • 在上层语境中声明v,因此您可以从任何地方访问它
    • 将v声明为demo2的一个属性,将其作为参数传递给question_checker(对我来说听起来更好,因此Demo2的责任是显示并检查问题的答案)
    • 将v声明为demo1的属性,将其作为参数传递给Demo2构造函数和question_checker

    顺便说一句,如果你没有使用StringVar的跟踪功能(对每个变量做出反应),你就可以摆脱StringVar

    class Demo2:
        def __init__(self, master):
            #[...]
            self.entry = tk.Entry(self.master)
            self.entry.pack()
            #[...]
        def close_windows(self):
            #access entry content through
            self.entry.get()
    

    还要注意在tkinter中创建一个几何图形错误地初始化窗口小部件变量。它始终包含None,因为pack(和grid)始终返回无。