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
中的一个单独模块中。