Python GUI生成数学方程

3
我有一个关于Python GUI的作业问题。
我的目标是创建一个GUI,询问一个随机的数学方程,如果这个方程被正确求解,那么我将收到一条消息,说明它是正确的。
我的主要问题是找出在哪里放置语句,以便它们显示在标签中;我有1个文本框生成随机方程,下一个文本框为空,供我输入解决方案,然后是一个“Enter”按钮,用于评估我的解决方案。
它看起来像这样:
[*randomly generated equation*][*Empty space to enter solution*] [ENTER]

我已经得到了布局和评估参数,但我不知道接下来怎么做。
以下是目前的代码:
class Equation(Frame):

    def __init__(self,parent=None):
        Frame.__init__(self, parent)
        self.pack()
        Equation.make_widgets(self)
        Equation.new_problem(self)

    def make_widgets(self):
        Label(self).grid(row=0, column=1)
        ent = Entry(self)
        ent.grid(row=0, column=1)
        Label(self).grid(row=0, column=2)
        ent = Entry(self)
        ent.grid(row=0, column=2)
        Button(self, text='Enter', command=self.evaluate).grid(row=0, column=3)

    def new_problem(self):
        pass

    def evaluate(self):
        result = eval(self.get())
        self.delete(0, END)
        self.insert(END, result)
        print('Correct')

3
目前,这个问题属于“过于局限”的类别。为了防止您的问题被关闭,我建议您重新表述问题,以便答案对该网站的其他用户更有帮助。例如,“如何在回调函数内更改Tkinter标签的值?”(回调是在事件被触发时调用的函数,在这种情况下,self.evaluate是相关的回调函数——我假设这就是您真正想要做的事情。) - Joel Cornett
谢谢你纠正我。我最近才开始学习GUI,所以不太清楚如何将GUI函数分组成一个合适的问题。 - Nero Dietrich
1
请使用self.make_widgets()替代Equation.make_widgets(self) - jfs
2个回答

1
self.labeltext = StringVar() # in __init__

# ...
Label(self, textvariable=self.labeltext) # in make_widgets

# ...
self.labeltext.set("Correct!") # in evaluate

0
make_widgets()函数中,您正在创建一堆小部件,但没有将它们分配给任何变量。这会防止您在创建后访问它们。尝试将它们分配给实例变量,例如:
def make_widgets(self):
        self.equation_label = Label(self)
        self.equation_label.grid(row=0, column=1) #notice that grid() is on another line
        self.entry1 = Entry(self)
        ent.grid(row=0, column=1)
        self.solution_label = Label(self)
        self.solution_label.grid(row=0, column=2)
        self.entry2 = Entry(self)
        ent.grid(row=0, column=2)
        self.button = Button(self, text='Enter', command=self.evaluate)
        self.button.grid(row=0, column=3)

这样,您可以从类中的其他函数中访问它们,如下所示:
self.solution_label.config(text="Hello World")

所以你的回调函数最终会看起来像这样:

def evaluate(self):
        result = eval(self.get())
        self.solution_label.config(text=str(result))

对于 Entry 小部件,您可以使用 J.F.Sebastian 的答案,或者您可以使用 insertdelete 方法(似乎您本来就想这样做):

def evaluate(self):
    #...some code...
    self.solution_entry.delete(0, END)
    self.solution_entry.insert(0, "Some text")
    #...more code...

Tkinterbook 是一个查找小部件配置选项等方面的绝佳资源。

编辑

另一种设置小部件值的方式请参阅J.F.Sebastian的答案


我正在取得一些语法方面的进展,但我有一个关于self.get()的小问题。'get'是否特定绑定到Tk导入?目前我收到了有关未定义的get错误,但是在我的笔记中,self.get与单个输入一起很好地工作。此外,由于我发布的代码来自作业模板,因此未导入Tk。 - Nero Dietrich
在这种情况下,self 可能指的是 Frame 的一个实例。Frame 没有 get() 方法。在 make_widgets 中所做的是创建一个 StringVar 对象,并将其设置为 self.some_var_nameStringVar 确实 有一个 get() 方法。您可以像这样访问它:self.some_var_name.get() - Joel Cornett
@NeroDietrich 另外,我在你的 make_widgets() 方法中还发现了一些问题。请注意我将 grid() 方法放在单独的一行上。 - Joel Cornett
啊,J.F. Sebastian的输入现在有意义了。谢谢。 - Nero Dietrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接