Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在PyQt5上循环方法调用时出现问题_Python 3.x_Pyqt5 - Fatal编程技术网

Python 3.x 在PyQt5上循环方法调用时出现问题

Python 3.x 在PyQt5上循环方法调用时出现问题,python-3.x,pyqt5,Python 3.x,Pyqt5,我在QtDesigner上做了一个小GUI,我希望每X秒更新一次其中的文本,因为其中包含一个时钟。然而,我选择的思路遇到了很多问题 因此,QTDesigner使用设置方法创建了class Ui\u MainWindow(对象):,设置方法是def setupUi(self,MainWindow):(我的整个GUI都是建立在这个方法的基础上)和def retranslateUi(self,MainWindow):(在写入文本时)。.ui生成的default代码调用方法(self.retransat

我在QtDesigner上做了一个小GUI,我希望每X秒更新一次其中的文本,因为其中包含一个时钟。然而,我选择的思路遇到了很多问题

因此,QTDesigner使用设置方法创建了
class Ui\u MainWindow(对象):
,设置方法是
def setupUi(self,MainWindow):
(我的整个GUI都是建立在这个方法的基础上)和
def retranslateUi(self,MainWindow):
(在写入文本时)。.ui生成的default代码调用方法(
self.retransateui(主窗口)
)作为
def setupUi(self,主窗口)
的最后一行

更新GUI的信息需要我循环编写方法,因此每X秒,它就会重写自己

    self.timer = QtCore.QTimer()
    self.timer.timeout.connect(lambda : self.retranslateUi(MainWindow))
    self.timer.start(30000)
上面的代码是我经过几个小时的研究后得到的(放弃使用线程的选项)。然而,它根本不起作用,这意味着写入的方法永远不会被调用,GUI只是空白

这是一个大代码,所以我不认为这将是一个好主意,张贴其全部,除非它是必要的

样本:

class Ui_MainWindow(object):
   def setupUi(self, MainWindow):
     (the UI)
     self.timer = QtCore.QTimer()
     self.timer.timeout.connect(lambda : self.retranslateUi(MainWindow))
     self.timer.start(30000)

   def retranslateUi(self, MainWindow):
     (write things on the labels and text boxes)

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.showMaximized()
sys.exit(app.exec_())

这听起来像是一种迂回的做事方式。将所有操作分组以设置
retranslateUi
中所有小部件的标签正是QtDesigner的工作方式。此方法通常仅在所有小部件添加到初始ui之后调用一次。手动设置或修改.ui时,您通常会直接设置标签的文本。我添加了一些调用API和时钟本身的方法。我觉得我需要能够在某种循环中调用retranslateUI,以便它在运行时直接更新GUI。你有什么建议吗?@wayzera不,你不需要用艾米的方式来称呼它,你也不应该;考虑一下如果你有一个非常复杂和扩展的UI会发生什么:<代码> ReTracLaTui可能会有成百上千种不同的字符串(不仅仅是标签,而且还有按钮、工具提示和状态提示),什么感觉应该重置所有这些,仅仅是因为你需要更新一个小部件?正如所指出的,重传正是设计器对所有函数进行分组所做的,并且实际上只是本地化的基础。你知道它的功能是什么吗?为什么?本地化是您不断更新的基础吗?目前我的GUI只有标签,并且
重新翻译ui
只在这些标签上写入内容。它里面的每一行代码(除了
MainWindow.setWindowTitle:
setText
setHtml
若我不应该再次调用它,我是否应该创建另一个具有完全相同内容的方法(不包括设置窗口标题的行)然后调用它?如果是这样,我应该如何在程序已经运行后自动调用它(因为
timeout.connect
没有响应)使它工作。在timer.start之后调用它可以解决问题。