谢谢 的 three_pineapples 强> 您的帮助。我使用了你所描述的第二种方式。它像一个梦想:)这是代码,如果有人需要它。
import sys import time from PyQt4 import QtCore, QtGui from ui import Ui_MainWindow from ui import Ui_SettingsWindow #Aplikacja obslugujaca bramki LF #zamiana pliku .ui na kod pythona #pyuic4 untitled.ui -o output.py #py to exe #python setup.py py2exe --includes sip class timerThread(QtCore.QThread): timeElapsed = QtCore.pyqtSignal(float) def __init__(self, parent=None): super(timerThread, self).__init__(parent) self.timeStart = None def start(self, timeStart): self.timeStart = timeStart return super(timerThread, self).start() def run(self): while self.parent().isRunning(): self.timeElapsed.emit(time.time() - self.timeStart) time.sleep(0.1) class myThread(QtCore.QThread): timeElapsed = QtCore.pyqtSignal(float) def __init__(self, parent=None): super(myThread, self).__init__(parent) self.timerThread = timerThread(self) self.timerThread.timeElapsed.connect(self.timeElapsed.emit) def run(self): self.timerThread.start(time.time()) iterations = 10000000000 while iterations: print "Running {0}".format(self.__class__.__name__) iterations -= 1 time.sleep(10) class SettingsWindow(QtGui.QMainWindow): #Constructor: def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui_settigns = Ui_SettingsWindow() self.ui_settigns.setupUi(self) class MainWindow(QtGui.QMainWindow): #Constructor: def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.settings = SettingsWindow()# Creates and stores SettingsWindow instance, MainWindow manages SettingsWindow self.myThread = myThread(self) self.myThread.timeElapsed.connect(self.on_myThread_timeElapsed) self.myThread.finished.connect(self.on_myThread_finished) #Nie wiem jak przerzucic to do pliku UI bez errorow #Toolbar settingsAction = QtGui.QAction(QtGui.QIcon('tools.jpg'), 'Ustawienia', self) settingsAction.setShortcut('Ctrl+U') settingsAction.triggered.connect(self.ShowSettings) self.toolbar = self.addToolBar('Settings') self.toolbar.addAction(settingsAction) def UpdateList(self): contest_name = self.ui.comboBox.currentText() #jakis try-catch tutaj sie przyda gdyby nie plik nie istnial #zczytuje z pliku liste robotow with open('database\%s.txt' % contest_name) as f: robots_list = f.read().splitlines() self.ui.listWidget.clear() self.ui.listWidget.addItems(robots_list) def Search(self): text = self.ui.lineEdit.text() self.ui.lineEdit.clear() item = self.ui.listWidget.findItems(text, QtCore.Qt.MatchExactly) #jakiegos try-catcha trzeba tutaj walnac self.ui.listWidget.setItemSelected(item[0], True) def ShowSettings(self): self.settings.show() @QtCore.pyqtSlot() def on_button_clicked(self): self.myThread.start() @QtCore.pyqtSlot(int) def on_myThread_timeElapsed(self, seconds): self.ui.lcdNumber.display(seconds) @QtCore.pyqtSlot() def on_myThread_finished(self): self.myThread.terminate() print "Done" if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = MainWindow() myapp.show() sys.exit(app.exec_())
设置窗口的实例是本地的 MainWindow.ShowSettings 方法。因此,它很快被垃圾收集,因为没有任何东西保持对窗口的引用。
MainWindow.ShowSettings
您可以通过两种方式解决此问题。第一种是在实例化时指定设置窗口的父级。第二种是将其存储为实例属性 MainWindow (例如 self.settings = ... )。
MainWindow
self.settings = ...