【问题标题】:How threads works in python线程如何在 python 中工作
【发布时间】:2021-10-17 16:11:41
【问题描述】:

我正在尝试根据一些教程创建用于控制 djitello 的应用程序,并且我想创建点击一些 gui 选项卡并在通过键盘控制无人机期间的可能性。 所以我考虑过使用线程,但我不会写。现在,当我使用我的应用程序时,它在单击激活键盘控制方法的按钮后冻结。有人可以解释我做错了什么吗?

这是keyboardControl的类:

from Modules.KeyPressModule import GetKeyPressed as keyPressed
from time import sleep
import logging

class KeyboardControlService():
    def __init__(self,passedTello):
        self.tello = passedTello
        self.startControl = False

    def Initialize(self,ui):
        self.ui = ui

    def GetKeyboardInput(self):
        lr,fb,ud,yv = 0,0,0,0
        speed = 30

        if(keyPressed("left")): lr = speed
        elif (keyPressed("right")): lr = -speed

        if(keyPressed("up")): fb = speed
        elif (keyPressed("down")): fb = -speed

        if(keyPressed("w")): ud = speed
        elif (keyPressed("s")): ud = -speed

        if(keyPressed("a")): yv = speed
        elif (keyPressed("d")): yv = -speed

        if(keyPressed("q")): self.tello.land()
        elif (keyPressed("e")): self.tello.takeoff()


        return [lr,fb,ud,yv]

    def StartControl(self):
        self.startControl = True
        while self.startControl:
            values = self.GetKeyboardInput()
            print("test")
            #self.tello.send_rc_control(values[0],values[1],values[2],values[3])
            sleep(0.05)
    def EndControl(self):
        self.startControl = False

该类用于按钮点击响应:

from djitellopy import Tello
from threading import Thread
from Services.KeyboardControlService import KeyboardControlService as keyboardControlService

class TelloService():
    def __init__(self):
        self.tello = Tello()
        self.keyboardControlService = keyboardControlService(self.tello)

    def UseKeyboardControl(self,UseIt,UI):
        if(UseIt == True):
            self.keyboardControlService.Initialize(UI)
            self.keyboardThread = Thread(target=self.keyboardControlService.StartControl(), daemon=True)
            self.keyboardThread.start()
        else:
            self.keyboardControlService.EndControl()
            self.keyboardThread.join()

【问题讨论】:

  • 如果您从代码中删除不必要的部分,并且只保留导致问题的部分,这会有所帮助
  • 我想展示整个两个类,我认为主要的问题是创建线程或获取键盘输入。在 UseKeyboardControl 方法中创建线程,在 StartControl 方法中使用键盘输入
  • 是的,你必须传递一个函数,而不是调用函数。这意味着您必须在 StartControl 之后删除括号 ()
  • 哦,好吧,这改变了很多,但我不确定我如何编写没有 self 的函数,并且仍然参考 Tello(无人机)而没有我无法移动他
  • 我不确定现在的问题是什么?多线程解决了吗?

标签: python multithreading tello-drone


【解决方案1】:

好的,我解决了 麻烦就在这里:

self.keyboardThread = Thread(target=self.keyboardControlService.StartControl(), daemon=True)

我传递的是函数而不是对象

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多