Достъп до притурка на PyQT извън нейния клас

една проста ситуация се оказва доста трудна.

Целта ми е да получа прозорец за актуализиране на състоянието на джаджа в друг прозорец. Да обясни:

Имам прозорец A с някои „данни“ и искам да бъдат записани в приспособлението textEdit на прозорец B. Спецификите на главния прозорец и уиджетите са

class MainWin(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(1127, 880)

        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.textEdit = QtGui.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(20, 150, 1081, 661))
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.textEdit.isUndoRedoEnabled ()

Това, което в момента не успявам да получа, е прост метод, който се извиква от друг прозорец (и друг файл) може да промени съдържанието вътре в textEdit. Не съм сигурен какво правя погрешно, но когато се опитам да импортирам класа или метода от класа, винаги изглежда, че имам проблем с

TypeError: необвързан метод updEdit() трябва да бъде извикан с MainWin екземпляр като първи аргумент (вместо това не получи нищо)

Много съм отворен за предложения и благодаря предварително!

Редактиране #1

от файл Rep.py (вторият прозорец, който просто извиквам)

def addTemplate(self):
        data = self.textBrowser.toPlainText()
        MainWin.MainWin.addText(MainWindow.MainWin,data)
        self.close()

От първия прозорец всичко, което трябва да направя, е:

def addText(self,data):
    self.textEdit.setText(data)

Аз съм сравнително нов в ООП, така че моля да ме извините, ако има някаква доста глупава грешка.


person Eloh666    schedule 30.09.2015    source източник
comment
Добавете метод към вашия клас, който задава текста, след което го извикайте от където искате.   -  person multivac    schedule 30.09.2015
comment
Покажете кода, където се опитвате да извикате този метод. Вероятно се опитвате да го извикате в класа MainWin, вместо в екземпляр от него.   -  person mata    schedule 30.09.2015
comment
Актуализиран, вероятно правя грешката, която споменахте, но не съм сигурен как да я поправя   -  person Eloh666    schedule 01.10.2015


Отговори (1)


Когато създавате втория прозорец, предайте препратка към първия прозорец и го запазете като атрибут:

class SecondWindow(QMainWindow):
    def __init__(self, firstwindow, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.firstwindow = firstwindow
        ...            

    def addTemplate(self):
        data = self.textBrowser.toPlainText()
        self.firstwindow.addText(data)

Ако вторият прозорец е QMainWindow или QDialog, можете също да направите първия прозорец родител на втория прозорец - в този случай няма да има нужда да го съхранявате като атрибут и можете просто да направите:

        self.parent().addText(data)

Правейки го по този начин също означава, че вторият прозорец ще се затвори автоматично, когато се затвори първият прозорец.

person ekhumoro    schedule 30.09.2015
comment
Благодаря, опитах, но когато се опитам да дам първия прозорец като аргумент за метода, това, което получавам, е AttributeError: обектът 'module' няма атрибут 'MainWindow' (което между другото е името на първия). Това, което предавам на init е mainWin.MainWindow. Преди това импортирах mainWin, но това, което идва в средата, е, че може да имам цикъл с импортиране като: Вторият прозорец е стартиран от първия, следователно импортирах в първия. Също така трябва да редактирам първия прозорец с втория. Така или иначе благодаря още веднъж! - person Eloh666; 02.10.2015