2016-12-21 15 views
3

Примечание: я уже прочитал сообщение this, и я этого не понимал, к сожалению. У меня есть настройки каталогов примерно так:Доступ к элементам GUI из-за пределов GUI класса в PyQt

Main_Folder 
|_ Base_Gui_File.py 
|_ Child_directory (a directory inside Main_Folder) 
    |_ __init__.py 
    |_ some_other.py 

У меня есть весь код GUI в Base_Gui_File.py файл, который был сгенерирован из designer (PyQt4). Имеется поле ввода текста QLineEdit, a кнопка QPushButton и текстовая область QTextBrowser.

По умолчанию QTextBrowser скрыт. Но то, что я хотел сделать, было то, что, когда кто-то что-то набирает в QLineEdit и нажимает QPushButton, он отправит строку от QLineEdit к методу в файле some_other.py в Child_Directory. И после выполнения чего-то с этой строкой, метод в файле some_other.py будет showQTextBrowser в Base_Gui_File.py, а также напечатать что-то в QTextBrowser.

До сих пор мне удалось отправить строку с Base_GUI_File.py в файл some_other.py, взяв ввод с QLineEdit. Вот код для обоих файлов:

some_other.py:

import sys 
sys.path.append("..") 
from Base_Gui_File import Ui_MainWindow 


class childone(object): 
    """docstring for childone""" 
    def __init__(self): 
     super(childone, self).__init__() 

    def somemethod(self, url): 
     pass 
     print 'Hey!' 
     final_string = str(url) + "Just tying this!" 
     print final_string 

Base_Gui_file.py:

# -*- coding: utf-8 -*- 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(800, 544) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.MyPushButton = QtGui.QPushButton(self.centralwidget) 
     self.MyPushButton.setGeometry(QtCore.QRect(680, 40, 75, 23)) 
     self.MyPushButton.setObjectName(_fromUtf8("MyPushButton")) 
     self.MyLabel = QtGui.QLabel(self.centralwidget) 
     self.MyLabel.setGeometry(QtCore.QRect(30, 30, 46, 13)) 
     self.MyLabel.setObjectName(_fromUtf8("MyLabel")) 
     self.MyTextArea = QtGui.QTextBrowser(self.centralwidget) 
     self.MyTextArea.setGeometry(QtCore.QRect(20, 110, 721, 361)) 
     self.MyTextArea.setObjectName(_fromUtf8("MyTextArea")) 
     self.MyTextField = QtGui.QLineEdit(self.centralwidget) 
     self.MyTextField.setGeometry(QtCore.QRect(100, 30, 571, 41)) 
     self.MyTextField.setObjectName(_fromUtf8("MyTextField")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     self.menuFIle = QtGui.QMenu(self.menubar) 
     self.menuFIle.setObjectName(_fromUtf8("menuFIle")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 
     self.menubar.addAction(self.menuFIle.menuAction()) 

     self.MyPushButton.clicked.connect(self.download_click) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.MyPushButton.setText(_translate("MainWindow", "PushButton", None)) 
     self.MyLabel.setText(_translate("MainWindow", "TextLabel", None)) 
     self.menuFIle.setTitle(_translate("MainWindow", "FIle", None)) 

    def download_click(self): 
      self.MyTextArea.textCursor().insertHtml('Im HERE!') # This is working as it should 
      url = str(self.MyTextField.text()) 

      from Child_directory.some_other import childone 

      childone().somemethod(url) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

Как я могу это сделать? Я начал программирование GUI и OO (Python) 2 дня назад, поэтому я в этом много нового. Так что, даже если это всего лишь руководство в правильном направлении, это было бы здорово!

ответ

1

Как я уже сказал в ответ, на который вы ссылаетесь: всегда необходимо редактировать модуль, созданный pyuic. Он предназначен для статического модуля, который вы импортируете в свою основную программу.

Кроме того, текущая структура вашей программы выглядит обратным. Основной сценарий должен быть на верхнем уровне, и все модули должны находиться в пакете под ним. Это гарантирует, что вам не нужно делать какие-либо странные операции с sys.path, чтобы импортировать ваши собственные модули. Вот то, что структура должна выглядеть следующим образом:

program 
    |_ main.py 
    |_ package 
     |_ __init__.py 
     |_ app.py 
     |_ gui.py 
     |_ utils.py 

Ваш main.py сценарий должен быть очень простым, и выглядеть следующим образом:

if __name__ == '__main__': 

    import sys 
    from package import app 

    sys.exit(app.run()) 

Это очень важно, чтобы делать вещи так, потому что путь этот скрипт станет первой записью в sys.path. Это означает, что вы можете сделать from package import xxx в любым другим модулем в вашей программе, и импорт будет всегда работать правильно.

app Модуль должен выглядеть следующим образом:

import sys 
from PyQt4 import QtCore, QtGui 
from package.gui import Ui_MainWindow 
from package import utils 

class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.setupUi(self) 
     self.MyPushButton.clicked.connect(self.download_click) 

    def download_click(self): 
     self.MyTextArea.textCursor().insertHtml('Hello World!') 
     url = str(self.MyTextField.text()) 
     utils.some_func(url) 

def run():  
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    return app.exec_() 

Обратите внимание, что я переехал внесенные изменения в ваш модуль графического интерфейса в модуль приложения. Класс MainWindow будет загружать все виджеты, добавленные в Qt Designer, и они станут атрибутами экземпляра класса.Поэтому, как только вы перестроили свою программу, вы должны сгенерировать модуль gui с помощью pyuic.

+0

Хорошо, отлично! Это имеет смысл. Большое спасибо за все эти советы, я нахожу, что очень часто создаю необычную структуру каталогов. Не могли бы вы немного рассказать о том, что вы имели в виду: «Итак, как только вы перестроили свою программу, вам нужно сгенерировать модуль gui с помощью pyuic»? Переустановите графический интерфейс? – Xonshiz

+0

Нет. Я имею в виду, что после внесения изменений, которые я предложил, вы можете повторно запустить pyuic в своем дизайнерском файле ui, чтобы создать новый модуль gui. Вот почему вы никогда не должны редактировать этот файл - каждый раз, когда вы вносите изменения в конструктор qt, вам нужно повторно запустить pyuic, который уничтожит все сделанные вами изменения. – ekhumoro

+0

Эй, извините за задержку. Я был занят экзаменами. Я сделал то, что вы упомянули, и теперь [я столкнулся с какой-то странной проблемой] (http://stackoverflow.com/questions/41328165/qtextbrowser-not-updating-in-pyqt-python). Спасибо за помощь здесь! – Xonshiz

 Смежные вопросы

  • Нет связанных вопросов^_^