簡體   English   中英

PyQT5 如何實現 QTimer 而不是 time.sleep

[英]PyQT5 how to implement QTimer instead of time.sleep

我正在嘗試用 QTimer 代替 time.sleep :(第 25 行)

def fireOrder(self, fire_cord, fire_mode):
    if fire_mode == "normalFire":
        angelMils = "Out of range"
        baseUnits = calculator.getCordsBasUnits(fire_cord[0], fire_cord[1])
        if baseUnits[1] > 50 and baseUnits[1] < 1250:
            angelMils = calculator.milsCalc(baseUnits[1])
        self.textUpdateMain(baseUnits[1], calculator.angleDegNorth(baseUnits[2]), angelMils)
        return

    else:
        for i in range(1, len(fire_cord)):
            baseUnits = calculator.getCordsBasUnits(fire_cord[0], fire_cord[i])   
            QtCore.QTimer.singleShot(2000, )
            angelMils = "Out of range"
            if baseUnits[1] > 50 and baseUnits[1] < 1250:
                angelMils = calculator.milsCalc(baseUnits[1])

            self.textUpdateMain(baseUnits[1], calculator.angleDegNorth(baseUnits[2]), angelMils)
            sleep(20)
        return

我試圖實現這樣的 QTimersingleShot() 函數:

def fireOrder(self, fire_cord, fire_mode):

    if fire_mode == "normalFire":
        angelMils = "Out of range"
        baseUnits = calculator.getCordsBasUnits(fire_cord[0], fire_cord[1])
        if baseUnits[1] > 50 and baseUnits[1] < 1250:
            angelMils = calculator.milsCalc(baseUnits[1])
        self.textUpdateMain(baseUnits[1], calculator.angleDegNorth(baseUnits[2]), angelMils)
        return

    else:
        for i in range(1, len(fire_cord)):
            QtCore.QTimer.singleShot(2000, self.update(fire_cord, i))
        return

def update(self, fire_cord, i):
    baseUnits = calculator.getCordsBasUnits(fire_cord[0], fire_cord[i])
    angelMils = "Out of range"
    if baseUnits[1] > 50 and baseUnits[1] < 1250:
        angelMils = calculator.milsCalc(baseUnits[1])

    self.textUpdateMain(baseUnits[1], calculator.angleDegNorth(baseUnits[2]), angelMils)
    return

但我收到此錯誤:

文件“D:/SquadCalc2/SquadMortarCalc2/main_stelli.py”,第 331 行,更新 QtCore.QTimer.singleShot(2000, ) 類型錯誤:參數不匹配任何重載調用:singleShot(int, PYQT_SLOT):沒有足夠的參數 singleShot( int, Qt.TimerType, PYQT_SLOT): 沒有足夠的參數

我現在已經沒有想法了,我還嘗試將時間的第二個參數放入 lambda QtCore.QTimer.singleShot(2000, lambda: self.update(fire_cord, i)) 但它沒有幫助。

完整代碼在這里: https : //github.com/Phoenix-64/SquadMortarCalc2/tree/area_fire_system

編輯:fire_cord 是一個列表,如:fire_cord = [[10, 20], [-10, 10], [-10, -40], [30, 40]]

你的 lambda 是在正確的軌道上。 我假設它有效,但多次為您提供相同的值。 這是因為只有 1 個 lambda 函數實例並且它在循環的每次迭代中都被覆蓋,所以所有的單發函數都指向同一個……最后一個。

另外,我假設您希望它們每 2 秒觸發一次? 如果是這樣,您需要乘以 i。

代替 lambda,試試 functools.partial。

import sys
from functools import partial
from PyQt5 import QtCore, QtWidgets


class Window(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super().__init__(parent)
        fire_cord = [[10, 20], [-10, 10], [-10, -40], [30, 40]]        
        for i in range(1, len(fire_cord)):
                QtCore.QTimer.singleShot(2000*i, partial(self.update, fire_cord, i))

    def update(self, fire_cord, i):
        print(f'{fire_cord[i]=}')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM