#python #python-2.7 #pyqt4
#python #python-2.7 #pyqt4
Вопрос:
Я испытываю странное поведение при попытке добавить два разных списка изнутри одной и той же функции.
x = 0
y = 0
list_1 = []
list_2 = []
def append_function(self):
self.x = 1
self.y = 1
self.list_1.append(self.x)
self.list_2.append(self.y)
print self.list_1
print self.list_2
Результат, который я ожидал бы от однократного запуска функции::
[1]
[1]
Если бы я запускал дважды, я бы ожидал:
[1,2]
[1,2]
Фактический результат, который я получаю от запуска функции один раз,:
[1]
Когда я запускаю функцию дважды, я получаю:
[1]
[1,2]
Каждый раз, когда я запускаю функцию, первый список отстает. Это происходит только тогда, когда я запускаю код внутри класса GUI. В противном случае он работает так, как ожидалось. Кто-нибудь знает, почему это происходит, или знает обходной путь?
Вот вся программа:
#imports
from PyQt4 import QtGui
from PyQt4 import QtCore
import ui_sof_test #Gui File
import sys
class Worker(QtCore.QThread):
def run(self):
pass
class Gui(QtGui.QMainWindow, ui_sof_test.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.start()
self.pushButton.clicked.connect(self.append_function)
x = 0
y = 0
list_1 = []
list_2 = []
def append_function(self):
self.x = 1
self.y = 1
self.list_1.append(self.x)
self.list_2.append(self.y)
print self.list_1
print self.list_2
#------------------------------------------------------------------------------------------------#
# Worker Thread(s) Setup #
##################################################################################################
def start(self):
self.setupWorker()
def setupWorker(self):
self.work = Worker()
#self.work.mcx.connect(self.setxy,QtCore.Qt.QueuedConnection)
#self.work.mcy.connect(self.move_cur_lifty,QtCore.Qt.QueuedConnection)
if not self.work.isRunning():#if the thread has not been started let's kick it off
self.work.start()
def main():
app = QtGui.QApplication(sys.argv) # A new instance of QApplication
form = Gui() # We set the form to be our ExampleApp (design)
form.show() # Show the form
app.exec_() # and execute the. app
if __name__ == '__main__': # if we're running file directly and not importing it
main() # run the main function
Комментарии:
1. То, как вы определили класс Gui [при условии, что отступ указан правильно, как указано],
list_1
иlist_2
являются атрибутами класса (по сути, глобальными значениями класса), а не атрибутами экземпляра . Это может объяснить поведение, которое вы видите.2. Мне нужно, чтобы они были глобальными классами. Это неприемлемо?
3. Да, но в этом случае вам потребуется тесная координация между вашими рабочими потоками, чтобы два потока не пытались одновременно записывать в глобальные переменные.
4. @John Я думал об этом, но приведенный выше пример приводит к тому же поведению, даже если рабочий поток ничего не делает.
5. Хм. Может быть, тогда происходит что-то еще. Вы сказали, что когда вы запускаете программу один раз, вы получаете вывод
[1]
. Но в — как это возможно, есть дваappend_function()
оператора печати? Можете ли вы попробовать изменить код так, чтобы каждый оператор печати содержал что-то уникальное (т. Е.print 'list_1 is: %s' % list_1
), А затем посмотреть, какой оператор печати отображается?
Ответ №1:
Проблема уникальна для консоли Iron Python в среде Spyder IDE. Запуск кода в другом терминале python дает ожидаемый результат.