我试图从运行在python上的tkinter中的一个从窗口传递一个值,但我就是搞不懂。以下是我目前掌握的代码:
#!/usr/bin/env python3
import time
import pigpio
from tkinter import *
GPIO=21
GPIO2=16
GPIO3=20
pi = pigpio.pi()
if not pi.connected:
exit()
pi.set_mode(GPIO,pigpio.OUTPUT)
pi.set_mode(GPIO2,pigpio.OUTPUT)
gv=int()
def tx_pulses(pi, GPIO, hertz, num, pulse_len=1):
motSpeed = int((1/(dscale.get()))*2000)
print(motSpeed)
pulse_len = motSpeed
assert num < 65536
num_low = num % 256
num_high = num // 256
wf = []
wf.append(pigpio.pulse(1<<GPIO, 0, pulse_len))
wf.append(pigpio.pulse(0, 1<<GPIO, pulse_len))
pi.wave_add_generic(wf)
wid = pi.wave_create()
if wid >= 0:
pi.wave_chain([255, 0, wid, 255, 1, num_low, num_high])
while pi.wave_tx_busy():
time.sleep(0.1)
pi.wave_delete(wid)
def runMotor():
motRevs = int(((scale.get())*400)*5.08)
print(motRevs)
pi.write(GPIO2,0)
pi.write(GPIO3,1)
tx_pulses(pi, GPIO, 1000, motRevs) # 250 pulses @ 1000 Hz
pi.write(GPIO3,0)
tx_pulses(pi, GPIO, 1000, motRevs) # 2391 pulses @ 5000 Hz
pi.write(GPIO2,1)
def setUp():
speedWin = Toplevel()
speedWin.geometry('800x600')
speedWin.title('Stepper Control')
label = Label(speedWin, text='Inches of Travel')
label.place(x=350, y=100)
scale = Scale(speedWin, from_=0.0, to=15.0 ,orient=HORIZONTAL,length=600, resolution=0.1, tickinterval=1)
scale.place(x=100, y=125)
dlabel = Label(speedWin, text='Speed')
dlabel.place(x=370, y=200)
dscale = Scale(speedWin, from_=1, to=10 ,orient = HORIZONTAL,length = 600, tickinterval=1)
dscale.place(x=100, y=225)
button = Button(speedWin, text='Apply Values', command=runMotor, padx = 20, pady = 20)
button.place(x=350, y=350)
button3 = Button(speedWin, text='Back To Main Window', command=speedWin.destroy, padx=20, pady=20)
button3.place(x=500, y=350)
speedWin.mainloop()
mainWin = Tk()
mainWin.geometry('800x600')
mainWin.title('Main Window')
button2 = Button(mainWin, text='Go To Setup', command=setUp, padx=20, pady=20)
button2.place(x=350, y=350)
mainWin.mainloop()
pi.stop()
当我按下“应用值”按钮时,我得到一个错误,说speedWin没有定义。我找了又找,但找不到答案或一些示例代码。完全是新手,所以请温柔点!在
您应该搜索带有
tkinter
关于组织tkinter代码的问题。不要认为下面的代码是一个很好的例子,只是一个快速运行代码的例子。在我在代码中看到的主要问题是,保存创建的小部件的变量是
setUp
函数的本地变量。您可以使它们成为全局变量,并结合使用global
关键字从多个函数访问它们。这有点难看,因为你可能开始增加全局变量的数量,你所需要的一切都变成了一个全局变量但是您也可以为第二个窗口定义一个类,比如
ControlPanel
,并将访问器函数作为该类的方法,并将小部件保存在变量成员中。如果函数需要引用ControlPanel
小部件,那么可以在类外部的代码中说cp.widget_name
是cp = ControlPanel()
或ControlPanel
类代码内的ControlPanel
实例对象,可以通过self.widget_name
引用。对于小部件或任何其他变量。在setUp
中的代码被传输到ControlPanel__init__
,后者在创建时初始化ControPanel对象。注意,类(方法)中的函数现在在其他函数之前需要一个self
参数。在不要调用
mainloop
两次,mainloop()
之后的代码只会在tkinter终止后运行。在请尝试以下重新组织的代码:
相关问题 更多 >
编程相关推荐