代码之家  ›  专栏  ›  技术社区  ›  Noel Sebastian Lim Jenq Ning

Tkinter-在类中使用按钮命令从另一个类调用函数

  •  0
  • Noel Sebastian Lim Jenq Ning  · 技术社区  · 8 年前

    我的程序正在使用类First中的一个按钮来触发类Second中的函数。但是,当按下按钮时,它要求我包含一个自变量,所以我如何使用这里建议的静态方法调用另一个函数( Python 3 Tkinter - How to call a function from another class )或者用其他方法来解决这个问题。

    如果你能建议我如何在第二节课上使用StringVar,那对我来说就更容易了。

    我认为代码中唯一需要修改的部分是:

    self.traceButton=Button(self.main_inner_frame,text="Trace",command=Second.printSecondLine())
    

    第二类代码:

    class Second(First):
        # @staticmethod
        def __init__(self,master):
            super().__init__(master)
    
        def printSecondLine(self):
            content = self.traceEntry.get()
            print(content)
    

    如果需要完整的代码:

    from tkinter import *
    class First(Frame):
        def __init__(self,master):
            super().__init__()
            master.minsize(width=755, height=520)
            master.maxsize(width=755, height=520)
            Grid.config(self)
    
            # Run all function in [First Class]
            self.widget_size()
            #self.getTEXT()
    
        def widget_size(self):
    
            # Define a small frame for it
            self.main_inner_frame = LabelFrame(self,text="Tracing Method",height= 120,width =355)
            self.main_inner_frame.grid(row= 0, column=0)
            self.main_inner_frame.grid_propagate(0)
    
            # Create a button for it [When trace click it will show the text in the entry on terminal]
            self.traceButton = Button(self.main_inner_frame, text="Trace",command=Second.printSecondLine())
            self.traceButton.grid(row = 0, column = 1, sticky = W)
    
            # Create a entry box for the user
            # use a string variable tvar
            tvar = StringVar()
            self.traceEntry = Entry(self.main_inner_frame,textvariable=tvar,width=30)
            self.traceEntry.grid(row = 0, column = 2, sticky = W)
    
        # def getTEXT(self):
            # content = self.traceEntry.get()
            # print(content)
    
    class Second(First):
        # @staticmethod
        def __init__(self,master):
            super().__init__(master)
    
        def printSecondLine(self):
            content = self.traceEntry.get()
            print(content)
            return content
    
    if __name__ == '__main__':
        root = Tk()
        root.title("Good System")
        TIF = First(root)
        root.mainloop()
    

    预期结果 当用户按下按钮时,条目将得到文本并显示在终端中。

    2 回复  |  直到 8 年前
        1
  •  1
  •   code beginner    8 年前

    解决了的。 我做了一些事情让你的代码按照你想要的规范工作:

    1. 在printSecondLine()方法上方添加了@staticmethod。
    2. 已从printsecondaline()参数列表中删除self。
    3. 使printsecondaline()接受名为value的参数。
    4. 删除并重新编写printsecondaline()方法的主体,使其按预期运行。
    5. 在按钮配置中使用了lambda表达式,因此可以轻松地传递数据。
    6. 将tvar作为lambda表达式的参数,因为这就是要传递给printsecondaline()的内容
    7. 将tvar和输入代码放在按钮代码上方。换个顺序也许可以。但我认为最好把tvar放在上面,因为你在从Button访问tvar之前先声明它。

    不管怎样,它是有效的。在entry中输入数据,单击按钮,数据进入控制台。您可能需要编写代码,以便在单击按钮后清除条目字段。但这是另一个话题,不难做到。

    from tkinter import *
    
    class First(Frame):
        def __init__(self,master):
            super().__init__()
            master.minsize(width=755, height=520)
            master.maxsize(width=755, height=520)
            Grid.config(self)
    
            # Run all function in [First Class]
            self.widget_size()
    
    
        def widget_size(self):
    
            # Define a small frame for it
            self.main_inner_frame = LabelFrame(self,text="Tracing Method",height= 120,width =355)
            self.main_inner_frame.grid(row= 0, column=0)
            self.main_inner_frame.grid_propagate(0)
    
            # Create a entry box for the user
            # use a string variable tvar
            tvar = StringVar()
            self.traceEntry = Entry(self.main_inner_frame,textvariable=tvar,width=30)
            self.traceEntry.grid(row = 0, column = 2, sticky = W)
    
            # Create a button for it [When trace click it will show the text in the entry on terminal]
            self.traceButton = Button(self.main_inner_frame, text="Trace",command=lambda: Second.printSecondLine(tvar))
            self.traceButton.grid(row = 0, column = 1, sticky = W)
    
    
    class Second(First):
        @staticmethod
        def __init__(self,master):
            super().__init__(master)
    
        @staticmethod
        def printSecondLine(value):
            print(value.get())
    
    
    if __name__ == '__main__':
        root = Tk()
        root.title("Good System")
        TIF = First(root)
        root.mainloop()
    
        2
  •  0
  •   Stanley    8 年前

    创建按钮时,除非使用类似于lambda的命令,否则不能将command=设置为与paranteses“()”一起使用。

    self.traceButton = Button(self.main_inner_frame,text="Trace",
    command= lambda: Second.printSecondLine())
    

    但这也应该奏效:

     self.traceButton = Button(self.main_inner_frame, text="Trace",command=Second.printSecondLine)
    
    推荐文章