Доступ к элементам PyQt Gui из другого файла - PullRequest
3 голосов
/ 04 июня 2011

Я изучаю PyQt и пришел из веб-дизайна, поэтому извините за этот вопрос, у которого должен быть очень очевидный ответ. Итак, я создаю приложение PyQt и хотел бы распространить методы на несколько файлов, чтобы соответствовать различным частям GUI.Как получить доступ к расположению текстового поля в fileA.py из fileB.py.:

#fileA.py
import sys
from PyQt4 import QtGui, QtCore
from gui1 import Ui_MainWindow
import fileB

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)


if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        window = MyApp()
        window.show()

        #This works all fine
        def pressed():
            window.plainTextEdit.appendPlainText("Hello")


        window.pushButton.pressed.connect(pressed)


        window.button2.pressed.connect(fileB.func3)
        sys.exit(app.exec_())    

Теперь в этом файле я хотел бы использовать текстовое поле из файла A.py

#fileB.py
import fileA

    #How do I access window.plainTextEdit from fileA.py
def func3():
    print "hello"
    fileA.window.plainTextEdit.appendPlainText("Hello")

Что я делаю не так?Как лучше всего распространить функциональность на несколько файлов, если не это?

Спасибо, что нашли время прочитать это.

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Вы можете воспользоваться наследованием классов Python, например:

fileA.py :

import sys
from PyQt4 import QtGui, QtCore
from gui1 import Ui_MainWindow
import fileB

class MyApp(fileB.MyApp, QtGui.QMainWindow):
  def __init__(self):
     self.MyMethod()
     # Should print 'foo'

fileB.py :

import sys
from PyQt4 import QtGui, QtCore
from gui1 import Ui_MainWindow

class MyApp(QtGui.QMainWindow):
  def MyMethod(self):
    print 'foo'
1 голос
/ 04 июня 2011

Ну, во-первых, код под if __name__ == "__main__" не будет никогда запускаться при импорте fileA.py, поэтому fileA.window не существует.Вот что он должен делать: запускать только тогда, когда __name__ равен "__main__", т.е. запускаться как программа верхнего уровня.Вместо этого вы должны импортировать fileA.py, создать QApplication и window снова, затем получить доступ к window.plainTextEdit.Однако это создает очень тесную связь между кодом, так как вы напрямую получаете доступ к виджету в MyApp из fileB.Возможно, было бы лучше, если бы вместо этого вы указали в MyApp метод, который добавляет текстовое поле вместо того, чтобы fileB.py делал это напрямую.Поэтому вы можете подумать о том, что вы хотите сделать и как структурировать свою программу.

Конечно, у вас нет для структурирования вашего кода таким образом;Вы можете просто сделать

window = MyApp()
window.plainTextEdit.appendPlainText("Hello")

в fileB, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...