Неожиданное поведение при добавлении нескольких списков внутри функции в PyQt GUI

#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 дает ожидаемый результат.