Python Qt4 类和 QTGui 窗口

Posted

技术标签:

【中文标题】Python Qt4 类和 QTGui 窗口【英文标题】:Python Qt4 classes & QTGui Windows 【发布时间】:2015-11-20 13:53:28 【问题描述】:

我正在尝试学习 Python 和 QT4。我喜欢比萨,所以我实现了一个程序,可以根据我要制作的比萨的数量计算配料量。

程序如下并完成它的工作。

class Pizza:
    # MEMBRI
    farina=0
    acqua=0
    lievito=0
    sale=0

    def stampaIngredientiPizza(self, f, a, l, s):
        self.stampaFarina=f
        self.stampaAcqua=a
        self.stampaLievito=l
        self.stampaSale=s

        print("Farina 00 (W240):            ", self.stampaFarina, "gr")
        print("Acqua:                       ", self.stampaAcqua, "gr")
        print("Lievito di birra:            ", self.stampaLievito, "gr")
        print("Sale:                        ", self.stampaSale, "gr")


class Romana(Pizza):
    # MEMBRI
    olio=0
    semola=0


class Napoletana(Pizza):
    # MEMBRI
    strutto=0
    manitoba=0


# INIZIALIZZAZIONE OGGETTI
#
# TONDA ROMANA
#
tondaRomana=Romana()
tondaRomana.farina=80
tondaRomana.semola=20
tondaRomana.acqua=57
tondaRomana.lievito=0.171
tondaRomana.sale=2.85
tondaRomana.olio=2.85


#
# TEGLIA ROMANA
#
# TUTTI I VALORI VANNO MOLTIPLICATI X 1,5
#


#
# TONDA NAPOLETANA
#
tondaNapoletana=Napoletana()
tondaNapoletana.farina=72
tondaNapoletana.manitoba=48
tondaNapoletana.acqua=72
tondaNapoletana.lievito=0.216
tondaNapoletana.sale=3.6
tondaNapoletana.strutto=7.2


#
# TEGLIA NAPOLETANA
#
# TUTTI I VALORI VANNO MOLTIPLICATI X 1,5
#


romaNapoli=-1                   # Romana o Napoleta
tondaTeglia=-1                  # Tonda o Teglia

print("\t\t\tPIZZA ROMANA o NAPOLETANA\n\n")

while(romaNapoli!=0):

    print("1) Pizza Romana")
    print("2) Pizza Napoletana")
    print("0) Uscita")

    romaNapoli=int(input("\nSelezione (0, 1 ,2)? "))


    if(romaNapoli==1):          ##### PIZZA ROMANA #####
        while(tondaTeglia!=0):
            print()

            print("1) Tonda 30cm")
            print("2) Teglia 40x35cm")
            print("0) Uscita")

            tondaTeglia=int(input("\nSelezione (0, 1 ,2)? ")) ##### TONDA O TEGLIA #####


            if(tondaTeglia==1):     # TONDA     
                quantePizze=eval(input("\nQuante pizze tonde da 30cm vuoi preparare? "))
                print()

                totaleImpasto=(tondaRomana.farina*quantePizze+tondaRomana.semola*quantePizze+
                               tondaRomana.acqua*quantePizze+tondaRomana.olio*quantePizze+tondaRomana.sale*quantePizze)

                if(quantePizze==1):
                    print("Per preparare", quantePizze, "pizza Romana in teglia tonda, ti occorrono:")
                    print()
                else:
                    print("Per preparare", quantePizze, "pizze Romane in teglia tonda, ti occorrono:")
                    print()            

                print("Farina di semola rimacinata: ", tondaRomana.semola*quantePizze, "gr")

                tondaRomana.stampaIngredientiPizza(tondaRomana.farina*quantePizze, tondaRomana.acqua*quantePizze, tondaRomana.lievito*quantePizze, tondaRomana.sale*quantePizze)

                print("Olio:                        ", tondaRomana.olio*quantePizze, "gr")
                print()
                print("Totale impasto:              ", totaleImpasto, "gr\n")
                premiUnTasto=input("Premi INVIO per continuare")
                print()


            if(tondaTeglia==2):     # TEGLIA
                quantePizze=eval(input("\nQuante pizze in teglia 40x35cm vuoi preparare? "))
                print()

                totaleImpasto=(tondaRomana.farina*1.5*quantePizze+tondaRomana.semola*1.5*quantePizze+
                               tondaRomana.acqua*1.5*quantePizze+tondaRomana.olio*1.5*quantePizze+tondaRomana.sale*1.5*quantePizze)

                if(quantePizze==1):
                    print("Per preparare", quantePizze, "pizza Romana in teglia rettangolare, ti occorrono:")
                    print()
                else:
                    print("Per preparare", quantePizze, "pizze Romane in teglia rettangolare, ti occorrono:")
                    print()

                print("Farina di semola rimacinata: ", tondaRomana.semola*1.5*quantePizze, "gr")

                tondaRomana.stampaIngredientiPizza(tondaRomana.farina*1.5*quantePizze, tondaRomana.acqua*1.5*quantePizze, tondaRomana.lievito*1.5*quantePizze,
                                                   tondaRomana.sale*1.5*quantePizze)

                print("Olio:                        ", tondaRomana.olio*1.5*quantePizze, "gr")
                print()
                print("Totale impasto:              ", totaleImpasto, "gr\n")
                premiUnTasto=input("Premi INVIO per continuare")
                print()


    if(romaNapoli==2):          ##### PIZZA NAPOLETANA #####
        print()

        print("1) Tonda 30cm")
        print("2) Teglia 40x35cm")
        print("0) Uscita")

        tondaTeglia=int(input("\nSelezione (0,1 ,2)? ")) ##### TONDA O TEGLIA #####
        if(tondaTeglia==0):
            break

        if(tondaTeglia==1):     # TONDA 
            quantePizze=eval(input("\nQuante pizze tonde da 30cm vuoi preparare? "))
            print()        

            totaleImpasto=(tondaNapoletana.farina*quantePizze+tondaNapoletana.manitoba*quantePizze+
                           tondaNapoletana.acqua*quantePizze+tondaNapoletana.strutto*quantePizze+
                           tondaNapoletana.sale*quantePizze)

            if(quantePizze==1):
                print("Per preparare", quantePizze, "pizza Napoletana in teglia tonda, ti occorrono:")
                print()
            else:        
                print("Per preparare ", quantePizze, "pizze Napoletane in teglia tonda, ti occorrono:")
                print()

            print("Farina manitoba :            ", tondaNapoletana.manitoba*quantePizze, "gr")

            tondaNapoletana.stampaIngredientiPizza(tondaNapoletana.farina*quantePizze, tondaNapoletana.acqua*quantePizze, tondaNapoletana.lievito*quantePizze,
                                                   tondaNapoletana.sale*quantePizze)

            print("Strutto:                     ", tondaNapoletana.strutto*quantePizze, "gr")
            print()
            print("Totale impasto:              ", totaleImpasto, "gr\n")
            premiUnTasto=input("Premi INVIO per continuare")
            print()

        if(tondaTeglia==2):     # TEGLIA
            quantePizze=eval(input("\nQuante pizze in teglia 40x35cm vuoi preparare? "))
            print()        

            totaleImpasto=(tondaNapoletana.farina*1.5*quantePizze+tondaNapoletana.manitoba*1.5*quantePizze+
                           tondaNapoletana.acqua*1.5*quantePizze+tondaNapoletana.strutto*1.5*quantePizze+
                           tondaNapoletana.sale*1.5*quantePizze)

            if(quantePizze==1):
                print("Per preparare", quantePizze, "pizza Napoletana in teglia rettangolare, ti occorrono:")
                print()
            else:        
                print("Per preparare ", quantePizze, "pizze Napoletane in teglia rettangolare, ti occorrono:")
                print()

            print("Farina manitoba :            ", tondaNapoletana.manitoba*1.5*quantePizze, "gr")

            tondaNapoletana.stampaIngredientiPizza(tondaNapoletana.farina*1.5*quantePizze, tondaNapoletana.acqua*1.5*quantePizze, tondaNapoletana.lievito*1.5*quantePizze,
                                                   tondaNapoletana.sale*1.5*quantePizze)

            print("Strutto:                     ", tondaNapoletana.strutto*1.5*quantePizze, "gr")
            print()
            print("Totale impasto:              ", totaleImpasto, "gr\n")
            premiUnTasto=input("Premi INVIO per continuare")
            print()

首先根据要制作的披萨类型进行选择:Romana 或 Napoletana 然后是形状:Tonda(圆形)或 Rettangolare(矩形) 然后是数量 并且有成分的打印输出。

比萨有 4 种基本成分:面粉、酵母、水、盐。 要制作 Romana,必须在 4 种基础上添加油和粗面粉。 做 Napoletana 必须在 4 个基础上添加猪油和马尼托巴

所以有一个基类比萨 以及两个派生类 Romana 和 Napoletana

现在我想给程序一个图形界面。 我写了这段代码,但由于我缺乏知识而遇到问题

import sys
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):

    def __init__(self):

        QtGui.QMainWindow.__init__(self)

        self.resize(750, 250)
        self.setWindowTitle("CALCOLATORE DOSI IMPASTO PER PIZZA ROMANA O NAPOLETANA")
        #self.setWindowIcon(QtGui.QIcon('pizza.jpg'))  

        self.schermataRomaNapoli()    

    # SCHERMATA SELEZIONE TIPO IMPASTO DA REALIZZARE: ROMANA O NAPOLETANA
    def schermataRomaNapoli(self):

        cWidget = QtGui.QWidget(self)
        grid = QtGui.QGridLayout(cWidget) 

        vBox = QtGui.QVBoxLayout()
        etichetta1 = QtGui.QLabel("Seleziona il tipo di pizza che vuoi preparare:", cWidget)
        etichetta1.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio1 = QtGui.QRadioButton("Pizza Romana", cWidget)
        radio1.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio1.clicked.connect(self.romana)
        radio2 = QtGui.QRadioButton("Pizza Napoletana", cWidget)
        radio2.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio2.clicked.connect(self.napoletana)
        radio3 = QtGui.QRadioButton("Uscita", cWidget)
        radio3.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio3.clicked.connect(self.close)
        vBox.addWidget(etichetta1)
        vBox.addWidget(radio1)
        vBox.addWidget(radio2)
        vBox.addWidget(radio3)         

        grid.addLayout(vBox, 1, 0)

        cWidget.setLayout(grid)
        self.setCentralWidget(cWidget)

    # PIZZA ROMANA
    def romana(self):

        global romaNapoli
        romaNapoli=" Romana "
        olio=0
        semola=0

        self.schermataTondaTeglia()

    # PIZZA NAPOLETANA
    def napoletana(self):

        global romaNapoli
        romaNapoli=" Napoletana "
        strutto=0
        manitoba=0

        self.schermataTondaTeglia()

    # SCHERMATA SELEZIONE FORMATO TEGLIA: TONDA 30cm O RETTANGOLARE 40x35cm
    def schermataTondaTeglia(self):

        cWidget = QtGui.QWidget(self)
        grid = QtGui.QGridLayout(cWidget) 

        vBox = QtGui.QVBoxLayout()
        etichetta1 = QtGui.QLabel("Seleziona il tipo di formato che vuoi preparare:", cWidget)
        etichetta1.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio1 = QtGui.QRadioButton("Tonda 30cm", cWidget)
        radio1.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio1.clicked.connect(self.schermataQuanteTonde)
        radio2 = QtGui.QRadioButton("Teglia 40x35cm", cWidget)
        radio2.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio2.clicked.connect(self.schermataQuanteRettangolari)
        radio3 = QtGui.QRadioButton("Indietro", cWidget)
        radio3.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        radio3.clicked.connect(self.schermataRomaNapoli)
        vBox.addWidget(etichetta1)
        vBox.addWidget(radio1)
        vBox.addWidget(radio2)
        vBox.addWidget(radio3)         

        grid.addLayout(vBox, 1, 0)

        cWidget.setLayout(grid)
        self.setCentralWidget(cWidget)

    # SCHERMATA SELEZIONE QUANTE PIZZE TONDE DA REALIZZARE
    def schermataQuanteTonde(self):

        global quantePizze, pizzaPizze, romaNapoli, tondaRettangolare
        quantePizze = QtGui.QInputDialog.getInt(self, "CALCOLATORE DOSI IMPASTO PER PIZZA ROMANA O NAPOLETANA", "Quante pizze tonde da 30cm vuoi preparare?", 1)       

        tondaRettangolare=" tonda"

        if(quantePizze[0]==1):
            pizzaPizze=" pizza"            

        # SE LE PIZZE SONO PIU' DI UNA, LE PAROLE PIZZA, ROMANA E NAPOLETANA DIVENTANO PLURALI: PIZZE, ROMANE, NAPOLETANE
        if(quantePizze[0]!=1):  
            pizzaPizze=" pizze"
            if(romaNapoli==" Romana "):
                romaNapoli=" Romane "
            else:
                romaNapoli=" Napoletane "

        if(romaNapoli==" Romana "):
            Romana()                        # VA SULLA CLASSE ROMANA(PIZZA)

        if(romaNapoli==" Napoletana "):
            Napoletana()                    # VA SULLA CLASSE NAPOLETANA(PIZZA)

    # SCHERMATA SELEZIONE QUANTE PIZZE RETTANGOLARI DA REALIZZARE
    def schermataQuanteRettangolari(self):

        global quantePizze, pizzaPizze, romaNapoli, tondaRettangolare
        quantePizze = QtGui.QInputDialog.getInt(self, "CALCOLATORE DOSI IMPASTO PER PIZZA ROMANA O NAPOLETANA", "Quante pizze rettangolari da 40x35cm vuoi preparare?", 1)

        tondaRettangolare=" rettangolare"

        if(quantePizze[0]==1):
            pizzaPizze=" pizza"

        # SE LE PIZZE SONO PIU' DI UNA, LE PAROLE PIZZA, ROMANA E NAPOLETANA DIVENTANO PLURALI: PIZZE, ROMANE, NAPOLETANE
        if(quantePizze[0]!=1):
            pizzaPizze=" pizze"
            if(romaNapoli==" Napoletana "):
                romaNapoli=" Napoletane "
            else:
                romaNapoli=" Romane " 

        if(romaNapoli==" Romana "):
            Romana()                        # VA SULLA CLASSE ROMANA(PIZZA)

        if(romaNapoli==" Napoletana "):
            Napoletana()                    # VA SULLA CLASSE NAPOLETANA(PIZZA)        


class Pizza(QtGui.QMainWindow):

    global farina, acqua, lievito, sale
    # INGREDIENTI PIZZA BASE
    farina=0
    acqua=0
    lievito=0
    sale=0  

    def __init__(self):

        QtGui.QMainWindow.__init__(self)

        self.resize(750, 250)
        self.setWindowTitle("CALCOLATORE DOSI IMPASTO PER PIZZA ROMANA O NAPOLETANA")
        self.setWindowIcon(QtGui.QIcon('pizza.jpg'))

        self.stampaIngredientiPizza(farina, acqua, lievito, sale)    

    # STAMPA INGREDIENTI BASE
    def stampaIngredientiPizza(self, f, a, l, s):
        stampaFarina=f
        stampaAcqua=a
        stampaLievito=l
        stampaSale=s

        # DA TOGLIERE
        quantePizze=['2']     
        pizzaPizze=" pizze"
        romaNapoli=" Romane "
        tondaRettangolare=" tonda"
        # DA TOGLIERE

        cWidget = QtGui.QWidget()

        grid = QtGui.QGridLayout(cWidget) 

        vBox = QtGui.QVBoxLayout()
        etichetta11 = QtGui.QLabel("Per preparare " + str(quantePizze[0])+ pizzaPizze + romaNapoli + "in teglia" + tondaRettangolare + ", ti occorrono:\n", cWidget)
        etichetta11.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta1 = QtGui.QLabel("Farina 00 (W240): " + str(stampaFarina) + "gr", cWidget)
        etichetta1.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta2 = QtGui.QLabel("Acqua:                    " + str(stampaAcqua) + "gr", cWidget)
        etichetta2.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta3 = QtGui.QLabel("Lievito di birra:     " + str(stampaLievito) + "gr", cWidget)
        etichetta3.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta4 = QtGui.QLabel("Sale:                        " + str(stampaSale) + "gr", cWidget)
        etichetta4.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        vBox.addWidget(etichetta11)
        vBox.addWidget(etichetta1)
        vBox.addWidget(etichetta2)
        vBox.addWidget(etichetta3)
        vBox.addWidget(etichetta4)        

        grid.addLayout(vBox, 1, 0)

        cWidget.setLayout(grid)
        self.setCentralWidget(cWidget)

# IMPASTO TONDA ROMANA
class Romana(Pizza):        

    tondaRettangolare=" tonda"      # DA TOGLIERE
    if(tondaRettangolare==" tonda"):

        def stampaIngredientiPizza(self, f, a, l, s):

            farina=80
            semola=20
            acqua=57
            lievito=0.171
            sale=2.85
            olio=2.85

            super(Romana, self).stampaIngredientiPizza(farina, acqua, lievito, sale)





app=QtGui.QApplication(sys.argv)
main=MainWindow()
main.show()
sys.exit(app.exec_())

代码的第一部分(MainWindow)有效。 如果我删除 Pizza Class 的 3 ''',则程序将无法运行。

它应该在窗口中打印 4 种基本成分(stampaIngredientiPizza 方法)。 它应该在同一个窗口中添加另外 2 种成分(tondaRomana 方法),具体取决于要制作的比萨饼的种类。

确定 mainWindow 类可以正常工作,我希望您能帮助我运行比萨类,然后将所有内容放在一起。我编辑了下面的代码。现在我有这个错误: NameError: name 'stampaIngredientiPizza' is not defined

    class Pizza(QtGui.QMainWindow):

    global farina, acqua, lievito, sale
    # INGREDIENTI PIZZA BASE
    farina=0
    acqua=0
    lievito=0
    sale=0  

    def __init__(self):

        QtGui.QMainWindow.__init__(self)

        self.resize(750, 250)
        self.setWindowTitle("CALCOLATORE DOSI IMPASTO PER PIZZA ROMANA O NAPOLETANA")
        self.setWindowIcon(QtGui.QIcon('pizza.jpg'))

        self.stampaIngredientiPizza(farina, acqua, lievito, sale)    

    # STAMPA INGREDIENTI BASE
    def stampaIngredientiPizza(self, f, a, l, s):
        stampaFarina=f
        stampaAcqua=a
        stampaLievito=l
        stampaSale=s

        # DA TOGLIERE
        quantePizze=['2']     
        pizzaPizze=" pizze"
        romaNapoli=" Romane "
        tondaRettangolare=" tonda"
        # DA TOGLIERE

        cWidget = QtGui.QWidget()

        grid = QtGui.QGridLayout(cWidget) 

        vBox = QtGui.QVBoxLayout()
        etichetta11 = QtGui.QLabel("Per preparare " + str(quantePizze[0])+ pizzaPizze + romaNapoli + "in teglia" + tondaRettangolare + ", ti occorrono:\n", cWidget)
        etichetta11.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta1 = QtGui.QLabel("Farina 00 (W240): " + str(stampaFarina) + "gr", cWidget)
        etichetta1.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta2 = QtGui.QLabel("Acqua:                    " + str(stampaAcqua) + "gr", cWidget)
        etichetta2.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta3 = QtGui.QLabel("Lievito di birra:     " + str(stampaLievito) + "gr", cWidget)
        etichetta3.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        etichetta4 = QtGui.QLabel("Sale:                        " + str(stampaSale) + "gr", cWidget)
        etichetta4.setFont(QtGui.QFont("Times", 20, QtGui.QFont.Bold))
        vBox.addWidget(etichetta11)
        vBox.addWidget(etichetta1)
        vBox.addWidget(etichetta2)
        vBox.addWidget(etichetta3)
        vBox.addWidget(etichetta4)        

        grid.addLayout(vBox, 1, 0)

        cWidget.setLayout(grid)
        self.setCentralWidget(cWidget)

# IMPASTO TONDA ROMANA
class Romana(Pizza):        

    tondaRettangolare=" tonda"      # DA TOGLIERE
    if(tondaRettangolare==" tonda"):

        def stampaIngredientiPizza(self, f, a, l, s):

            farina=80
            semola=20
            acqua=57
            lievito=0.171
            sale=2.85
            olio=2.85

            super(Romana, self).stampaIngredientiPizza(farina, acqua, lievito, sale)

app=QtGui.QApplication(sys.argv)
pizza=Romana()
pizza.show()
sys.exit(app.exec_())

【问题讨论】:

什么“不工作”?您可以尝试缩短代码以拥有MCVE 吗? tondaRettangolare in class Romana(Pizza) 虽然它是一个全局变量,但它没有定义。 Romana(Pizza) 类中的 stampaIngredientiPizza(farina, acqua, lievito, sale) 不生成打印输出。评论 Pizza Class 及其子类时,MainWindows 一直工作到成分打印输出 确定 mainWindow 类可以工作,我希望您能帮助我运行比萨类,然后将所有内容放在一起。我编辑了下面的代码。现在我有这个错误: NameError: name 'stampaIngredientiPizza' is not defined 我制作了一个 MCVE。最后一个代码只有两个类。现在我有这个错误: NameError: name 'stampaIngredientiPizza' is not defined。我无法从 Romana(Pizza) 类中启动 stampaIngredientiPizza 方法 最后一次修改代码并使用超类工作。现在的问题是如何从 MainWindow 调用 class Romana(Pizza) 【参考方案1】:

您不应该使用全局变量。制作 GUI 时,全局变量非常糟糕。您可能需要多个项目,但您依赖于全局值。当您想要操作实例变量时,您也在操作类变量。您应该在 MainWindow 中实例化变量。

例子:

class Pizza(object):
    '''Create a pizza'''

    def __init__(self):
        self.farina=0
        self.acqua=0
        self.lievito=0
        self.sale=0
        self.olio=0
        self.semola=0
        self.strutto=0
        self.manitoba=0

        self.set_default_ingredients()
    # end Constructor

    @classmethod
    def default_ingredients(cls):
        '''Return the default ingredients for a pizza.'''
        return 'farina':0, 'acqua':0, 'lievito':0, 'sale':0

    def set_default_ingredients(self):
        '''Set the default ingredients.'''
        self.farina=0
        self.acqua=0
        self.lievito=0
        self.sale=0
        self.olio=0
        self.semola=0
        self.strutto=0
        self.manitoba=0
    # end set_default_ingredients

    def bake(self):
        '''Bake the pizza.'''
        pass # Do something to bake the pizza.
    # end class Pizza

class Romana(Pizza):
    '''Create a special Romana Pizza.'''

    @classmethod
    def default_ingredients(cls):
        '''Return the default ingredients for a Romana Pizza.'''
        return 'farina':80, 'semola':20, 'acqua':57, 'lievito':0.171, 'sale':2.85, 'olio':2.85

    def set_default_ingredients(self):
        '''Set the default ingredients for a Romana Pizza.'''
        self.farina=80
        self.semola=20
        self.acqua=57
        self.lievito=0.171
        self.sale=2.85
        self.olio=2.85

class Napoletana(Pizza):
    '''Create a special Napoletana Pizza.'''

    @classmethod
    def default_ingredients(cls):
        '''Return the default ingredients for a Romana Pizza.'''
        return 'farina':72, 'manitoba':48, 'acqua':72, 'lievito':0.216, 'sale':3.6, 'strutto':7.2

    def set_default_ingredients(self):
        '''Set the default ingredients for a Romana Pizza.'''
        self.farina=72
        self.manitoba=48
        self.acqua=72
        self.lievito=0.216
        self.sale=3.6
        self.strutto=7.2


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super().__init__()

        self.main_widg = QtGui.QWidget()
        self.main_layout = QtGui.QFormLayout()
        self.main_widg.setLayout(self.main_layout)
        self.setCentralWidget(self.main_widg)

        self.current_pizza = Pizza()

        self.pizza_type = QtGui.QComboBox()
        self.pizza_type.addItems(['Pizza', 'Romana', 'Napoletana'])
        self.pizza_type.currentIndexChanged.connect(self.select_pizza)

        # Ingredients
        self.farina = QtGui.QLineEdit('0')
        self.farina.textChanged.connect(self.set_farina)
        self.acqua = QtGui.QLineEdit('0')
        self.acqua.textChanged.connect(self.set_acqua)
        self.lievito = QtGui.QLineEdit('0')
        self.lievito.textChanged.connect(self.set_lievito)
        self.sale = QtGui.QLineEdit('0')
        self.sale.textChanged.connect(self.set_sale)
        self.olio = QtGui.QLineEdit('0')
        self.olio.textChanged.connect(self.set_olio)
        self.semola = QtGui.QLineEdit('0')
        self.semola.textChanged.connect(self.set_semola)
        self.strutto = QtGui.QLineEdit('0')
        self.strutto.textChanged.connect(self.set_strutto)
        self.manitoba = QtGui.QLineEdit('0')
        self.manitoba.textChanged.connect(self.set_manitoba)

        # Actions
        self.bake_btn = QtGui.QPushButton("Bake")
        self.bake_btn.clicked.connect(self.bake)

        # Layout
        self.main_layout.addRow('Pizza Type', self.pizza_type)
        self.main_layout.addRow('farina', self.farina)
        self.main_layout.addRow('acqua', self.acqua)
        self.main_layout.addRow('lievito', self.lievito)
        self.main_layout.addRow('olio', self.olio)
        self.main_layout.addRow('semola', self.semola)
        self.main_layout.addRow('strutto', self.strutto)
        self.main_layout.addRow('manitoba', self.manitoba)
        self.main_layout.addRow(self.bake_btn)
    # end __init__

    def select_pizza(self, idx):
        if self.pizza_type.currentText() == 'Pizza':
            self.current_pizza = Pizza()
        elif self.pizza_type.currentText() == 'Romana':
            self.current_pizza = Romana()
        else:
            self.current_pizza = Napoletana()
        self.set_values()
    # end select_pizza

    def set_values(self):
        '''Set the values from the current pizza.'''
        self.farina.setText(str(self.current_pizza.farina))
        self.acqua.setText(str(self.current_pizza.acqua))
        self.lievito.setText(str(self.current_pizza.lievito))
        self.sale.setText(str(self.current_pizza.sale))
        self.olio.setText(str(self.current_pizza.olio))
        self.semola.setText(str(self.current_pizza.semola))
        self.strutto.setText(str(self.current_pizza.strutto))
        self.manitoba.setText(str(self.current_pizza.manitoba))

    def set_farina(self, val):
        self.current_pizza.farina = val
    def set_acqua(self, val):
        self.current_pizza.acqua = val
    def set_lievito(self, val):
        self.current_pizza.lievito = val
    def set_sale(self, val):
        self.current_pizza.sale = val
    def set_olio(self, val):
        self.current_pizza.olio = val
    def set_semola(self, val):
        self.current_pizza.semola = val
    def set_strutto(self, val):
        self.current_pizza.strutto = val
    def set_manitoba(self, val):
        self.current_pizza.manitoba = val

    def bake(self):
        self.current_pizza.bake()
# end class MainWindow


if __name__ == "__main__":
    import sys
    QtGui.QApplication([])

    window = MainWindow()
    window.show()

    sys.exit(QtGui.qApp.exec_())

此用户界面的主要目的是与 current_pizza 值进行交互。通过更改比萨饼类型,您可以更改显示的默认值。更改 GUI 中的值会更改您正在使用的对象。该实例包含在主窗口中,因此您可以调用 MainWindow() 两次并拥有两个彼此独立的工作主窗口。

在这个例子中,我还在基类 Pizza 中包含了所有不同的配料和配料。这使得任何人都可以使用您可用的任何成分制作比萨饼。如果您选择像 Romana 这样的特色披萨,那么用户界面将使用该披萨类型填充值,并且用户可以按照他们想要的方式对其进行调整。

【讨论】:

非常感谢。现在我有很多东西要研究,但首先,如果我运行程序,没有任何附加内容(我还包括:import sys 和 from PyQt4 import QtGui, QtCore lines at TOP) 我只是给你一个如何编写代码的例子。该程序不应该做任何事情。 我的意思是 [链接](www.mediafire.com/view/akdb9gzodhh48st/pizza.png#) 您是否将其作为主要运行? ''if name == "main":'' 语句使得代码仅在主文件时运行。这样在另一个项目中你可以使用''import Pizza''并从另一个文件或项目中调用''pizza.Romana()''。 effbot.org/pyfaq/tutor-what-is-if-name-main-for.htm MainWindow 是类。您必须有一个应用程序才能运行 GUI。即使你''导入比萨''并调用''w = Pizza.MainWindow()''''w.show()''。你仍然需要调用 ''app = QtGui.QApplication([])'' 和 ''sys.exit(app.exec_())''。

以上是关于Python Qt4 类和 QTGui 窗口的主要内容,如果未能解决你的问题,请参考以下文章

python 类的定义

Python QtGui 创建带有按钮的下拉列表

PyQt:没有这样的插槽

OS X 上的 PyQt4 和 Python 3.2

QT开发——窗口组件和窗口类型

项目qt4迁移代码到qt5