Python 在类内调用不同的函数

Python 在类内调用不同的函数,python,class,tkinter,Python,Class,Tkinter,我有一个关于类中函数的问题。我的目标是用可视化类编写一个程序,该类使用tkinter和另一个名为传感器处理的类处理所有与GUI相关的内容,该类主要测试传感器是否工作,并返回结果,然后显示在可视化中。我的GUI类有问题 我在类可视化中有两个不同的函数,即StartPage和TestingHead\u页面。我传递root以便他们能够直接修改我的应用程序。现在,我想用我的按钮bTestingHead显示TestingHead\u页面,但我得到一个错误,即TestingHead\u页面未定义 我该如何处

我有一个关于类中函数的问题。我的目标是用
可视化
类编写一个程序,该类使用tkinter和另一个名为
传感器处理
的类处理所有与GUI相关的内容,该类主要测试传感器是否工作,并返回结果,然后显示在
可视化
中。我的GUI类有问题

我在类可视化中有两个不同的函数,即StartPage和
TestingHead\u页面
。我传递root以便他们能够直接修改我的应用程序。现在,我想用我的按钮
bTestingHead
显示
TestingHead\u页面
,但我得到一个错误,即
TestingHead\u页面
未定义

我该如何处理这个问题? 当我想学习时,批评总是被欣赏的

import tkinter as tk
from tkinter import ttk

import serial
import platform
import time

LARGEFONT = ("Verdana", 35)

class Visualization:

    def StartPage(self, root):

        lTitle= ttk.Label(root, text ="Title", font = LARGEFONT)
        lTitle.grid(row = 0, column = 1, sticky = "N", padx = 10, pady = 10)
        lTitle.config(font = ('Calibri', 32, 'bold'))

        lTesting = ttk.Label(root, text = "Testing", font = ('calibri', 20))
        lTesting.grid(row = 1, column = 0, padx = 10, pady = 10)

        bTestingHead = ttk.Button(root, text = "Testing Head", command = self.TestingHead_Page(root))
        bTestingHead.grid(row = 2 , column = 0, padx = 20, pady = 20)

        exit = tk.PhotoImage(file = "exit_icon.png")
        bExit = ttk.Button(root, text = "exit", image = exit, command = root.destroy)
        bExit.image = exit
        bExit.place(relx = 1.0, rely = 0.0, anchor = 'ne')

    def TestingHead_Page(self, root):

        lTitle = ttk.Label(root, text = "Testing Head")
        lTitle.grid(row = 0, column = 0, sticky = "W", padx = 10, pady = 10)

        bStartPage = ttk.Button(root, text = "Start Page", command = "")
        bStartPage.grid(row = 0, column = 1, sticky = "E", padx = 10, pady = 10)

        exit = tk.PhotoImage(file = "exit_icon.png")
        bExit = ttk.Button(root, text = "exit", image = exit, command = root.destroy)
        bExit.image = exit
        bExit.place(relx = 1.0, rely = 0.0, anchor = 'ne')

    if __name__ == "__main__":

        root = tk.Tk()
        guiref = StartPage(self, root)
        tk.mainloop()

#class SensorHandling():

在python中,您需要在类的方法中显式地传递通过
self
关键字引用的当前实例:

def StartPage(self, root):
    ...

def TestingHead_Page(self, root):
    ...
在课堂上,你可以这样称呼他们:

self.StartPage(root)
self.TestingHead_Page(root)
仔细阅读


另外,从代码来看,
TestingHead\u页面
应该返回一些值,因为您尝试在
command=TestingHead\u页面(root)
中捕获该值,因此您也需要修复该问题。

谢谢您的回答。我也考虑过这一点,但是,当我将self作为参数传递时,我得到一个NameError“name'self'未定义”,我缺少什么?使用self added编辑代码,让我们知道哪一行给出了错误@Dimilo在类外,您可以调用这些方法,如
guiref.StartPage(root)
,等等。顺便说一句,我确实编辑了代码,第64行给出了我第一次调用StartPage时的错误:“guiref=StartPage(self,root)”,您没有通过类外的
self
。你没有在课堂外使用关键字
self
,它没有任何意义。当您像
guiref.StartPage(root)
那样调用时,
self
被隐式传递。阅读Python中的
self
关键字@DimiloI知道你不在类外使用
self
,但它与if语句一起在类中使用
Visualization
,不是吗?看起来你试图采用一种流行的方式,在tkinter(接受答案)中显示多个页面,这涉及到将每个“页面”作为一个单独的类,并将它们嵌套在
可视化
中。虽然这可能是可行的,但通过将每个页面类转换为该类的一个方法,您已经做得不对了。除此之外,嵌套类很少在Python中完成,因为这样做没有什么好处,而且它们的使用也有点困难。我选择这种方法是因为如果我只有一个类包含所有GUI相关的内容,并且有一个类为我做这项工作,那么它似乎更容易使用。如果我这样做,或者像你说的那样,让每个页面都成为一个单独的类,这不是更痛苦吗?我建议让每个页面类成为一个单独的类(就像我提到的示例中那样)但是将它们都放在单独的模块中,该模块将
导入到定义
可视化
类的脚本中,然后可以根据需要使用它们。您还可以将它们和
可视化
类放在一个脚本中,然后让主代码导入该模块以完成应用程序的该部分。谢谢您的推荐。但是我没有得到你答案的一部分。你建议将每个页面作为一个单独的类,但仍然将它们放在单独的模块中?我的意思是将每个页面作为一个单独的
,并将它们全部(一起)放在
import
中的一个单独模块中。