树莓派Tkinter GUI开发报错App实例无updateRed属性原因咨询
错误原因
- 核心问题是你把
updateRed、updateGreen、updateBlue三个方法定义在了App类的外部,它们现在是全局函数,不属于App类的成员,所以实例化后调用self.updateRed自然会提示找不到属性。 - 同时你代码里还有缩进错误:
__init__方法下的所有代码都没有正确缩进,Python中缩进代表代码块归属,没有缩进的内容不属于__init__方法,运行时也会触发语法错误。
和Python版本的关系
你当前遇到的AttributeError报错和Python版本无关,完全是代码结构的问题。但需要注意你代码里from Tkinter import *是Python 2的Tkinter导入写法,如果你是在Python 3环境下运行,修正完当前错误后会触发导入报错,需要改成from tkinter import *。
修正后的完整代码
# Python 3环境下把下面一行改成 from tkinter import * from Tkinter import * import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) GPIO.setup(23, GPIO.OUT) GPIO.setup(24, GPIO.OUT) pwmRed = GPIO.PWM(18, 500) pwmRed.start(100) pwmGreen = GPIO.PWM(23, 500) pwmGreen.start(100) pwmBlue = GPIO.PWM(24, 500) pwmBlue.start(100) class App: def __init__(self, master): # __init__内部代码正确缩进 frame = Frame(master) frame.pack() Label(frame, text='Red').grid(row=0, column=0) Label(frame, text='Green').grid(row=1, column=0) Label(frame, text='Blue').grid(row=2, column=0) scaleRed = Scale(frame, from_=0, to=100, orient=HORIZONTAL, command=self.updateRed) scaleRed.grid(row=0, column=1) scaleGreen = Scale(frame, from_=0, to=100, orient=HORIZONTAL, command=self.updateGreen) scaleGreen.grid(row=1, column=1) scaleBlue = Scale(frame, from_=0, to=100, orient=HORIZONTAL, command=self.updateBlue) scaleBlue.grid(row=2, column=1) # 三个方法缩进进入App类内部,成为类成员 def updateRed(self, duty): pwmRed.ChangeDutyCycle(float(duty)) def updateGreen(self, duty): pwmGreen.ChangeDutyCycle(float(duty)) def updateBlue(self, duty): pwmBlue.ChangeDutyCycle(float(duty)) root = Tk() root.wm_title('RGB LED Control') app = App(root) root.geometry("200x150+0+0") root.mainloop()
内容的提问来源于stack exchange,提问作者Onesimus Chandra Pradhan
相关产品推荐
相关产品推荐

