如何在Raspberry Pi Python中使用带Tkinter的多进程

如何在Raspberry Pi Python中使用带Tkinter的多进程,tkinter,multiprocess,tkinter-scale,Tkinter,Multiprocess,Tkinter Scale,我试图同时移动两个伺服。但是我不能移动它。因为第二个电机在完成第一个电机运动后移动,这是我在tkinter刻度上命令的。 我已从多进程导入进程并尝试。 当我将缩放命令从command=self.update更改为command=Process(target=update,args()).start时,它会给我name错误:未定义名称“update” 我不知道我应该做什么,所以任何帮助都将不胜感激 我的工作(非同时)代码如下 #!/usr/bin/env python #-*- coding: u

我试图同时移动两个伺服。但是我不能移动它。因为第二个电机在完成第一个电机运动后移动,这是我在tkinter刻度上命令的。 我已从多进程导入进程并尝试。 当我将缩放命令从
command=self.update
更改为
command=Process(target=update,args()).start
时,它会给我
name错误:未定义名称“update”

我不知道我应该做什么,所以任何帮助都将不胜感激

我的工作(非同时)代码如下

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from Tkinter import *
import pigpio
import time

servos = 4-5 #GPIO number
pi = pigpio.pi()
horz = int(500)
vert = int(650)
pi.set_servo_pulsewidth(5, 500)
pi.set_servo_pulsewidth(4, 650)

try:
    class App:

        def __init__(self, master):
            frame = Frame(master)
            frame.pack()

            scale = Scale(frame, from_=2500, to=500,
            orient=HORIZONTAL, command=self.update)  
            scale.grid(row=0)

            scale = Scale(frame, from_=650, to=2000,
            orient=VERTICAL, command=self.update2)
            scale.grid(row=10)

        def update(self, angle_yat):
            global horz
            a = int(angle_yat)
            if horz <= a:
                for i in range(horz, a, 20):
                    pi.set_servo_pulsewidth(5, i)
                    print "yatay ai: ", i
                    time.sleep(0.001)
                    horz = a
            else:
                for i in range(horz, a, -20):
                    pi.set_servo_pulsewidth(5, i)
                    print "yatay ai: ", i
                    time.sleep(0.001)
                    horz = a


        def update2(self, angle):
            global vert
            b = int(angle)
            if vert <= b:
                for i in range(vert, b, 20):
                    pi.set_servo_pulsewidth(4, i)
                    print "yatay ai: ", i
                    time.sleep(0.001)
                    vert = b
            else:
                for i in range(vert, b, -20):
                    pi.set_servo_pulsewidth(4, i)
                    print "dikey ai: ", i
                    time.sleep(0.001)
                    vert = b


    root = Tk()
    root.wm_title('Servo Control')
    app = App(root)
    root.geometry("200x150+0+0")    
    root.mainloop()
except KeyboardInterrupt:
    pi.set_servo_pulsewidth(servos, 0)

finally:
    pi.stop()
#/usr/bin/env python
#-*-编码:utf-8-*-
从Tkinter进口*
进口pigpio
导入时间
伺服=4-5#GPIO编号
pi=pigpio.pi()
horz=int(500)
垂直=int(650)
设定伺服脉冲宽度(5500)
pi.设定伺服脉冲宽度(4650)
尝试:
类应用程序:
定义初始(自我,主):
帧=帧(主帧)
frame.pack()
比例=比例(框架,从=2500到=500,
方向=水平,命令=自我更新)
比例网格(行=0)
比例=比例(帧,从0=650到=2000,
方向=垂直,命令=自我。更新2)
比例网格(行=10)
def更新(自我、角度):
全球地轴
a=int(角度)

如果horz要使用
多处理
您必须将代码放入函数/类中,并使用
如果uuuu name uuuu='uuuu main uuu'
,因为新进程运行运行运行相同文件的新python进程,而
如果uuuu name uuuu='.\uuu main uu'
决定哪部分仅在主进程中执行,哪部分在新进程中执行。如果你没有
如果uuu name uuu='\uuu main uuu'
那么两个进程启动相同的函数,你就有了混乱。顺便说一句:
tkinter
在(毫秒,函数名)
之后有函数
,它可以用来周期性地执行一些函数,并且可以多次工作,而不是多进程,子进程或线程。您没有
update
update2
-您有
app.update
app.update
@furas,谢谢。当我移动GUI tkinter标尺时,我正试图将伺服移动到
tkinter
scale
。我的代码中有两个更新函数
update
用于水平移动,而
update2
用于垂直移动。例如,当我发出第一个水平移动命令并立即垂直移动时;我的水平伺服做自己的运动。完成水平运动后,垂直伺服开始自己的运动。这就是我的问题。
update
update2
只需要做一些小动作,这样你就可以多次执行它们来完成全部动作。然后您可以使用
after()
定期执行这两个函数,看起来这两个函数同时工作。