2016-12-21 2 views
3

Remarque: J'ai déjà lu this et je ne l'ai pas compris malheureusement. J'ai un paramètres du répertoire un peu comme ceci:Accès aux éléments GUI depuis la classe GUI externe dans PyQt

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

J'ai tout le code de l'interface graphique dans le fichier Base_Gui_File.py, qui a été généré à partir designer (PyQt4). Il y a un champ de saisie de texte QLineEdit, un bouton poussoir QPushButton et une zone de texte QTextBrowser.

Par défaut, QTextBrowser est masqué. Mais, ce que je voulais faire était que, quand quelqu'un tape quelque chose dans le QLineEdit et clique sur le QPushButton, il va envoyer la chaîne de QLineEdit à une méthode dans some_other.py fichier dans le Child_Directory. Et après avoir fait quelque chose avec cette chaîne, la méthode dans le fichier some_other.py sera show le QTextBrowser dans le Base_Gui_File.py et également imprimer quelque chose dans le QTextBrowser.

Jusqu'ici j'ai été en mesure d'envoyer la chaîne de Base_GUI_File.py au fichier some_other.py en prenant l'entrée du QLineEdit. Voici le code pour les deux fichiers:

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_()) 

Comment puis-je faire? J'ai commencé la programmation en GUI et OO (Python) il y a 2 jours, donc je suis plutôt novice en la matière. Donc, même si c'est juste un guide dans la bonne direction, ce serait génial!

Répondre

1

Comme je l'ai dit dans la réponse que vous avez liée à: il est toujours une erreur d'éditer le module généré par pyuic. Il s'agit d'un module statique que vous importez dans votre programme principal.

En outre, la structure actuelle de votre programme regarde en arrière. Le script principal devrait être au plus haut niveau, et tous les modules devraient être dans un paquet en dessous. Cela garantira que vous n'avez pas besoin de faire des manipulations bizarres pour importer vos propres modules. Voici ce que la structure devrait ressembler à:

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

Votre script main.py devrait être très simple, et ressembler à ceci:

if __name__ == '__main__': 

    import sys 
    from package import app 

    sys.exit(app.run()) 

Il est très important de faire les choses de cette façon, parce que le chemin de ce script deviendra la première entrée dans sys.path. Cela signifie que vous pouvez ensuite faire from package import xxx dans tout autre module dans votre programme, et les importations fonctionneront toujours correctement.

Le module app devrait ressembler à ceci:

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_() 

Notez que j'ai déplacé les modifications apportées à votre module dans le module IUG d'application. La classe MainWindow récupèrera tous les widgets que vous avez ajoutés dans Qt Designer et deviendra des attributs de l'instance de classe.Donc, une fois que vous avez réorganisé votre programme, vous devez générer à nouveau le module gui en utilisant pyuic.

+0

OK, super! C'est logique. Merci beaucoup pour tous ces conseils, je me retrouve en train de faire une structure de répertoire bizarre très souvent. Pourriez-vous préciser un peu ce que vous entendiez par "Donc, une fois que vous avez réarrangé votre programme, vous devriez générer de nouveau le module gui en utilisant pyuic"? Réorganiser l'interface graphique? – Xonshiz

+0

Non - Je veux dire, une fois que vous avez fait les changements que j'ai suggérés, vous pouvez relancer pyuic sur votre fichier ui designer pour créer un nouveau module gui. C'est pourquoi vous ne devriez jamais éditer ce fichier - chaque fois que vous faites des changements dans qt designer, vous devez relancer pyuic, ce qui détruira toutes les modifications que vous avez faites précédemment. – ekhumoro

+0

Hey, désolé pour le retard. J'étais occupé avec les examens. J'ai fait comme vous l'avez mentionné et maintenant [j'ai rencontré un problème étrange] (http://stackoverflow.com/questions/41328165/qtextbrowser-not-updating-in-pyqt-python). Merci pour votre aide ici! – Xonshiz