动态更改按钮在 tkinter 中调用的命令的问题

问题描述

在这个简单的计算器 GUI 中,我正在使用类创建框架模板。该框架有 2 个标签、2 个输入框和一个按钮。我希望按钮根据初始化时传递的 function_call 变量运行特定命令 - 但这不起作用。应为第一个对象调用 two_points 函数,为第二个对象调用 one_point。如何根据我使用的对象动态更改调用的命令?感谢您抽出时间阅读本文。

from tkinter import *

root = Tk()
root.title("Simple Slope Calculator")

class Slope_Calc:
    # Variable info that changes within the frame
    def __init__(self,master,num_1,num_2,frame_name,label_1_name,label_2_name,function_call):
        self.num_1 = int(num_1)
        self.num_2 = int(num_2)
        self.frame_name = frame_name
        self.label_1_name = label_1_name
        self.label_2_name = label_2_name
        self.function_call = function_call

        # Frame template
        self.frame_1 = LabelFrame(master,text = self.frame_name,padx = 5,pady = 5)
        self.frame_1.grid(row = self.num_1,column = self.num_2,padx = 10,pady = 10)

        self.label_1 = Label(self.frame_1,text = self.label_1_name)
        self.label_1.grid(row = 0,column = 0)

        self.entry_1 = Entry(self.frame_1)
        self.entry_1.grid(row = 0,column = 1)

        self.label_2 = Label(self.frame_1,text = self.label_2_name)
        self.label_2.grid(row = 1,column = 0)

        self.entry_2 = Entry(self.frame_1)
        self.entry_2.grid(row = 1,column = 1)

        self.calc_button = Button(self.frame_1,text = "Calculate",command = self.function_call) # This is what doesn't work
        self.calc_button.grid(row = 1,column = 2,padx = 5)

    # Strips string of spaces and parentheses
    # Returns a list of relevant ordered pair
    def strip_string(self,entry_num):
        ordered_pair = entry_num.get().split(",")
        ordered_pair[0] = ordered_pair[0].replace("(","")
        ordered_pair[1] = ordered_pair[1].replace(")","")
        return(ordered_pair)

    # Calculates slope based on one point and y-intercept
    def one_point(self):
        pair_1 = self.strip_string(self.entry_1)

        b = int(self.entry_2.get())
        m = (int(pair_1[1]) - b)/(float(pair_1[1]))

        label_3 = Label(self.frame_1,text = "SLOPE-INTERCEPT EQUATION:   y = " + str(m) + "x + " + str(b))
        label_3.grid(row = 2,column = 0,columnspan = 2)


    # Calculates slope based on two points given
    def two_points(self):
        pair_1 = self.strip_string(self.entry_1)
        pair_2 = self.strip_string(self.entry_2)

        m = (int(pair_2[1]) - int(pair_1[1]))/float(int(pair_2[0]) - int(pair_1[0]))
        b = (int(pair_1[1])) - (m*int(pair_1[0]))

        label_3 = Label(self.frame_1,columnspan = 2)
  
# Calling each object
two_p = Slope_Calc(root,"Two Points","First Ordered Pair","Second Ordered Pair","two_points")
one_p = Slope_Calc(root,1,"One Point and Y-Intercept","Ordered Pair","Y-intercept","one_point")

root.mainloop()

解决方法

command 构造函数的 Button 关键字参数应该是一个函数。 在这里你给它一个字符串,它是应该调用的 self 方法的名称。因此,您必须首先使用 setattr 获取此方法才能调用它。应该这样做:


        def call():
            method = getattr(self,self.function_call)
            method()

        self.calc_button = Button(
            self.frame_1,text = "Calculate",command = call)

然后您在 strip_string 中有错误,但那是另一回事了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...