2016-12-21 13 views
3

Hinweis: Ich habe bereits this Post gelesen und ich habe es leider nicht verstanden. Ich habe ein Verzeichnis Einstellungen bekam etwas wie folgt aus:Zugreifen auf GUI-Elemente von außerhalb der GUI-Klasse in PyQt

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

Ich habe alle GUI-Code in der Datei Base_Gui_File.py bekam, die von designer (PyQt4) generiert wurde. Es gibt ein Texteingabefeld QLineEdit, eine Drucktaste QPushButton und eine Textfläche QTextBrowser.

Standardmäßig ist QTextBrowser ausgeblendet. Aber was ich wollte, war, dass, wenn jemand etwas in die QLineEdit und klickt auf die QPushButton, es die Zeichenfolge von QLineEdit zu einer Methode in some_other.py Datei in der Child_Directory sendet. Und nach etwas mit dieser Zeichenfolge, wird die Methode in der some_other.py Datei show die QTextBrowser in der Base_Gui_File.py und auch etwas in der QTextBrowser drucken.

Bisher konnte ich die Zeichenfolge von Base_GUI_File.py zu some_other.py Datei senden, indem Sie die Eingabe von QLineEdit. Hier ist der Code für die beiden Dateien:

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

Wie kann ich dies tun? Ich habe vor 2 Tagen angefangen, GUI und OO zu programmieren (Python), also bin ich ziemlich neu. Also, auch wenn es nur ein Wegweiser in die richtige Richtung ist, wäre das großartig!

Antwort

1

Wie ich in der Antwort sagte Sie verlinkt: Es ist immer ein Fehler, das Modul von pyuic generiert zu bearbeiten. Es ist ein statisches Modul, das Sie in Ihr Hauptprogramm importieren.

Auch die aktuelle Struktur Ihres Programms sieht nach hinten. Das Hauptscript sollte auf der obersten Ebene sein und alle Module sollten in einem Paket darunter liegen. Dadurch wird sichergestellt, dass Sie keine seltsamen Manipulationen an Ihren eigenen Modulen vornehmen müssen. Hier ist, was die Struktur aussehen soll:

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

Ihre main.py Skript sollte sehr einfach sein, und wie folgt aussehen:

if __name__ == '__main__': 

    import sys 
    from package import app 

    sys.exit(app.run()) 

Es ist sehr wichtig, die Dinge so zu tun, weil der Weg der Dieses Skript wird zum ersten Eintrag in sys.path. Das bedeutet, Sie können dann from package import xxx in jedes andere Modul in Ihrem Programm tun, und die Importe werden immer korrekt funktionieren.

Das app Modul sollte wie folgt aussehen:

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

Bitte beachte, dass ich die Änderungen verschoben haben Sie zu Ihrem GUI-Modul in die App Modul. Die Klasse MainWindow ruft alle Widgets auf, die Sie in Qt Designer hinzugefügt haben, und sie werden zu Attributen der Klasseninstanz.Sobald Sie Ihr Programm neu angeordnet haben, sollten Sie das GUI-Modul mit pyuic neu generieren.

+0

Okay, großartig! Das macht Sinn. Vielen Dank für all diese Tipps, ich merke, dass ich sehr oft seltsame Verzeichnisstrukturen mache. Könnten Sie ein wenig ausdrücken, was Sie mit "So, nachdem Sie Ihr Programm neu angeordnet haben, sollten Sie das GUI-Modul mit Pyuic neu generieren"? Die GUI neu anordnen? – Xonshiz

+0

Nein - ich meine, sobald Sie die von mir vorgeschlagenen Änderungen vorgenommen haben, können Sie pyuic erneut in Ihrer Designer-UI-Datei ausführen, um ein neues GUI-Modul zu erstellen. Aus diesem Grund sollten Sie diese Datei nie bearbeiten - jedes Mal, wenn Sie Änderungen am qt-Designer vornehmen, müssen Sie pyuic erneut ausführen, wodurch alle zuvor vorgenommenen Änderungen gelöscht werden. – ekhumoro

+0

Hey, Entschuldigung für die Verzögerung. Ich war mit Prüfungen beschäftigt. Ich tat, wie Sie erwähnt haben und jetzt [ich stieß auf ein seltsames Problem] (http://stackoverflow.com/questions/41328165/qtextbrowser-not-updating-in-pyqt-python). Danke für Hilfe hier! – Xonshiz

Verwandte Themen