[英]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.