Python - komunikacia medyi modulmi

Sekcia: Programovanie 19.01.2014 | 18:37
Avatar Bobo   Používateľ

Snazim sa spravit moju prvu aplikaciu a mam problem s komunikaciou medyi modulmi. Mam tri subory irrigation.py, main.py a nastavenia.py. Naskor som mal iba prve dva a fungovalo to. Vztvoril som nastavenia.py a chcel by som tam dat vsetky pociatocne nastavenia resp. hodnoty. Na skusku som tam zadal pridanie hodnoty do ComboBoxu. V irrigation.py naimportujem modul nastavenia a potom sa ho snazim zavolat. Skoncim s chybou ImportError: cannot import name Ui_Form. Vedeli by ste mi pomoct ?

http://pastebin.com/3SBEEJYt

http://pastebin.com/mpvkFy5M

http://pastebin.com/bnuvR10c

    • RE: Python - komunikacia medyi modulmi 20.01.2014 | 19:29
      Avatar LUcoRP Debian, *Ubuntu, Android  Administrátor

      v prvom rade si skus prejst odporucania na stackoverflow - ked zacinas programovat, bude to tvoj kamarat, s ktorym stravis vela casu :)

      Ked si vyskusal ich odporucania, tak daj vediet (osobne to typujem na zle nakonfigurovanu PATH v pythone)

      git blame | Muj Desvorc je vetsi nez tvuj!
      • RE: Python - komunikacia medyi modulmi 21.01.2014 | 23:02
        Avatar Bobo   Používateľ

        Tak trapim sa s tzmto uz druhy den. Prehladal som snad cely internet a mne sa to nedari naprogramovat. Prestavam tomu rozumiet. Na skusku som spravil velice jednoduchy priklad.Mam stale problem s volanim funkcie fill. Myslim si, ze PATH mam nastavene celkom dobre. Oba python subory mam v rovnakej zlozke resp. pouzivam Eclipse a tam som vytvoril projekt, ktorz obsahuje tie dva subory. Mohli bz ste mi trochu pomoct ?

        test.py

        from PyQt4 import QtCore, QtGui
        import fill_combobox
        
        
        
        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_Form(object):
            def setupUi(self, Form):
                Form.setObjectName(_fromUtf8("Form"))
                Form.resize(400, 300)
                self.comboBox = QtGui.QComboBox(Form)
                self.comboBox.setGeometry(QtCore.QRect(160, 120, 51, 25))
                self.comboBox.setObjectName(_fromUtf8("comboBox"))
                fill_combobox.fill()
                self.retranslateUi(Form)
                QtCore.QMetaObject.connectSlotsByName(Form)
        
            def retranslateUi(self, Form):
                Form.setWindowTitle(_translate("Form", "Form", None))

        fill_combobox.py

        
        from PyQt4 import QtGui
        
        
        def fill():
            import test
            okno = QtGui.QWidget
            a = test.Ui_Form
            a.setupUi(okno)
            a.comboBox.addItems("1")
               
        if __name__ == "__main__":
            import sys
            import test
            app = QtGui.QApplication(sys.argv)
            Form = QtGui.QWidget()
            ui = test.Ui_Form()
            ui.setupUi(Form)
            Form.show()
            sys.exit(app.exec_())
        • RE: Python - komunikacia medyi modulmi 22.01.2014 | 17:53
          Avatar LUcoRP Debian, *Ubuntu, Android  Administrátor

          Nie je mi z kodu celkom jasne co si chcel aby to robilo a preco volas z konkretnej funkcie znova cely hlavny file (prvy riadok v def fill()) a preco podmienkujes hlavne okno v subore s doplnkovymi funkciami. Kazdopadne funkciu fill(), ktora ti doplni do roletky udaje z vedlajsieho suboru zavolas takto:

          test.py

          from PyQt4 import QtCore, QtGui
          import fill_combobox
          
          
          
          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)
          
          
          
          if __name__ == "__main__":
                  import sys
                  import test
                  app = QtGui.QApplication(sys.argv)
                  Form = QtGui.QWidget()
                  ui = test.Ui_Form()
                  ui.setupUi(Form)
                  Form.show()
                  sys.exit(app.exec_())
          
          
          
          class Ui_Form(object):
              def setupUi(self, Form):
                  Form.setObjectName(_fromUtf8("Form"))
                  Form.resize(400, 300)
                  self.comboBox = QtGui.QComboBox(Form)
                  self.comboBox.setGeometry(QtCore.QRect(160, 120, 51, 25))
                  self.comboBox.setObjectName(_fromUtf8("comboBox"))
                  fill_combobox.fill(self)
                  self.retranslateUi(Form)
                  QtCore.QMetaObject.connectSlotsByName(Form)
          
              def retranslateUi(self, Form):
                  Form.setWindowTitle(_translate("Form", "Form", None))
          
          

          fill_combobox.py

          
          def fill(self):
              self.comboBox.addItems("1")
          
          

          Nemam cas prechadzat cely tvoj kod, ale vo vseobecnosti - Funkciu musis volat na konkretny objekt (v tomto pripade je to objekt self). Kedze v danej funkcii mas ale konkretne zaradeny objekt, ktory funkcia upravuje, minas sa vyznamu pouzitia univerzalnosti objektoveho programovania. Lepsie by podla mna bolo z hlavneho suboru volat funkciu fill_combobox.fill(self.[nazov objektu - cize v tvojom pripade comboBox]) a samotna funkcia by potom vyzerala:

          def fill(ui):
              ui.addItems("1")
          

          Odpoved ber s rezervou - mojim hlavnym programovacim jazykom je PHP a Pythonu sa venujem iba okrajovo, ked mi zvysi cas. Takze sa moze moje riesenie lisit od dobrych mravov Pythonistov :)

          git blame | Muj Desvorc je vetsi nez tvuj!