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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tkinter - 在类中使用Button命令从另一个类调用函数相关的知识,希望对你有一定的参考价值。

我的程序使用First类中的按钮来触发Second类中的函数。但是,当按下按钮时,它需要我包含一个self参数,那么如何通过使用静态方法建议表单(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()

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

答案

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

  1. 将@staticmethod添加到printSecondLine()方法之上。
  2. 从printSecondLine()参数列表中删除了self。
  3. make printSecondLine()接受一个名为value的参数。
  4. gutted并重新编写了printSecondLine()方法的主体,以便它按预期运行。
  5. 在Button配置中使用lambda表达式,以便可以轻松传递数据。
  6. 把tvar作为lambda表达式的参数,因为那是你要传递给printSecondLine()的东西
  7. 将tvar和Entry代码放在Button代码上方。在其他顺序中可能没问题。但我认为最好把tvar放在上面,因为你在从Button访问它之前再声明它。

无论如何,它的工作原理。您将数据输入到条目中,单击按钮,数据将进入控制台。您可能希望在单击按钮后编写清除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()
另一答案

在创建按钮时,除非像这样使用lambda,否则不能将command =设置为括号'()'。

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)

以上是关于Tkinter - 在类中使用Button命令从另一个类调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在类中使用托管bean设置变量,并从另一个托管bean中的此类获取变量

如何在类python tkinter OOP中使用命令更改按钮的背景?

Tkinter:整个应用程序的一大类

如何从另一个类调用指向成员的函数? [复制]

tkinter: 基本+Button+Layout

tkinter: 基本+Button+Layout