Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter-在类中使用按钮命令从另一个类调用函数_Python_Function_Class_Tkinter - Fatal编程技术网

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

Python Tkinter-在类中使用按钮命令从另一个类调用函数,python,function,class,tkinter,Python,Function,Class,Tkinter,我的程序使用第一个类中的按钮来触发第二个类中的函数。但是,当按下按钮时,它要求我包含一个自参数,因此我如何使用静态方法suggered form here()或使用其他替代方法来调用另一个函数 如果你能建议我如何在第二堂课上使用StringVar,我会觉得更容易 我认为代码中唯一应该修改的部分: self.traceButton=Button(self.main_inner_frame,text="Trace",command=Second.printSecondLine()) 第二类代码:

我的程序使用第一个类中的按钮来触发第二个类中的函数。但是,当按下按钮时,它要求我包含一个自参数,因此我如何使用静态方法suggered form here()或使用其他替代方法来调用另一个函数

如果你能建议我如何在第二堂课上使用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()
预期结果 当用户按下按钮时,条目将获得文本并显示在终端中

创建按钮时,不能将command=设置为与parantesses“()”一起工作,除非使用类似的lambda

但这也应该起作用:

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

已解决。我做了几件事来让您的代码按照您想要的规范工作:

  • 在printSecondLine()方法上方添加了@staticmethod
  • 已从printSecondLine()参数列表中删除self
  • 使printSecondLine()接受名为value的参数
  • 删除并重新编写printSecondLine()方法的主体,使其按预期运行
  • 在按钮配置中使用lambda表达式,因此可以轻松地传递数据
  • 将tvar作为lambda表达式的参数,因为这是要传递给printSecondLine()的内容
  • 将tvar和输入代码置于按钮代码上方。换成另一种顺序也许可以。但我认为最好把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()
    

    Yap,使用command=Second.printSecondLine,它显示类型错误:缺少1个必需的位置参数:“self”将
    printSecondLine()
    移动到
    First
    并删除无意义的
    Second
    。然后,
    command=self.printSecondLine
    对于此函数,确认是没有意义的。但是我有一个巨大的类,它将存储在另一个文件中,如果我解决这个最小化程序,我可以在我的大程序中做以下事情:在第二个类中,我将使用它来跟踪所有windows用户活动历史,因此,这部分我将只使用它从文件对话框目录中获取XXX文本,我已经知道如何做到这一点,只是需要从另一个班级得到,对我来说应该没有问题。如果是没有意义的,我不会创建这个来帮助我解决我的程序中更大的问题…希望你理解。如果我遵循你的建议,谢谢你,因为简单的程序是可以的。但是我的第一个程序已经是一个收集证据的主界面,所以我没有必要把一个复杂的代码放在一个已经有很多代码的文件中,我这样做只是为了干净的代码。你可以有一个
    Second
    类,但在
    First
    中有
    printSecondLine
    (顺便说一句,给所有东西起个更好、有意义的名字)。不清楚为什么
    printSecondLine
    应该在
    Second
    中,如果它所做的一切都与
    First
    相关。这是我的完整系统代码:wuahts3是我的主python。举个巨大的例子:windows证据的所有跟踪过程都将在另一个类中完成,其中有一个函数需要打开文件对话框directo当用户在主文件(wuahts3)中按下跟踪按钮时,将来会有一个按钮用于不同类的多个函数,所以如果我需要从第二类获得该功能以实现我的目标,您能帮助我吗?(基于我的小示例,我确信有一种方法是正确的?
    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()