Python-如何在函数外部访问变量?

时间:2014-07-13 09:23:22

标签: python pyqt pyqt4

我试图从函数外部访问变量。我添加了global sayacglobal sayi(从其他相关问题中看到了这一点),但我仍然无法访问它们。这是我遇到问题的程序的一部分:

def guesss(self):
    global tahmin
    global sayac
    tahmin=self.tahminn.text()
    sayac=sayac +1
    tahmin = int(tahmin)
    if tahmin==sayi:
        self.durum.setText ("Tahmininiz doğru!")
        QtGui.QMessageBox.warning(None,"Tahmininiz doğru","Doğru sayıyı ",sayac," denemede buldunuz!")
        self.tahminett.setEnabled(False)
        self.tahminn.setEnabled(False)
        self.ybaslatt.show()
    elif tahmin>sayi:
        self.durum.setText("Tahmininiz doğru sayıdan büyük.")
    elif tahmin<sayi:
        self.durum.setText("Tahmininiz doğru sayıdan küçük.")
    else:
        QtGui.QMessageBox.warning(None,"Geçersiz sayı","Sadece 1 ile 100 arasında bir sayı girebilirsiniz.")    

完整计划:

import random
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(473, 326)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.baslatt = QtGui.QPushButton(self.centralwidget)
        self.baslatt.setGeometry(QtCore.QRect(40, 240, 121, 41))
        self.baslatt.setObjectName(_fromUtf8("baslatt"))
        self.tahminett = QtGui.QPushButton(self.centralwidget)
        self.tahminett.setGeometry(QtCore.QRect(300, 240, 121, 41))
        self.tahminett.setObjectName(_fromUtf8("tahminett"))
        self.tahminn = QtGui.QLineEdit(self.centralwidget)
        self.tahminn.setGeometry(QtCore.QRect(90, 100, 261, 22))
        self.tahminn.setObjectName(_fromUtf8("tahminn"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 30, 451, 41))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 100, 47, 14))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.label_3 = QtGui.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 170, 57, 14))
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.durum = QtGui.QLabel(self.centralwidget)
        self.durum.setGeometry(QtCore.QRect(90, 170, 241, 16))
        self.durum.setText(_fromUtf8(""))
        self.durum.setObjectName(_fromUtf8("durum"))
        self.hakkinda = QtGui.QPushButton(self.centralwidget)
        self.hakkinda.setGeometry(QtCore.QRect(180, 240, 101, 41))
        self.hakkinda.setObjectName(_fromUtf8("hakkinda"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 473, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        QtCore.QObject.connect(self.hakkinda, QtCore.SIGNAL(_fromUtf8("clicked()")), self.hakkindamsg)
        QtCore.QObject.connect(self.baslatt, QtCore.SIGNAL(_fromUtf8("clicked()")), self.baslat_btn)
        QtCore.QObject.connect(self.tahminett, QtCore.SIGNAL(_fromUtf8("clicked()")), self.guesss)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.tahminett.setEnabled(False)
        self.tahminn.setEnabled(False)
    def hakkindamsg(self):
        QtGui.QMessageBox.about(None, "Hakkında", "Ege Öz 2014")

    def baslat_btn(self):
        sayac=0
        self.tahminn.setEnabled(True)   
        self.tahminett.setEnabled(True)
        self.baslatt.setEnabled(False)

        sayi=random.randint(0,100)

        self.durum.setText("1-100 arası bir sayı girin.")
        return sayi
        return sayac

    def guesss(self):
        global tahmin
        global sayac
        tahmin=self.tahminn.text()
        sayac=sayac +1
        tahmin = int(tahmin)
        if tahmin==sayi:
            self.durum.setText ("Tahmininiz doğru!")
            QtGui.QMessageBox.warning(None,"Tahmininiz doğru","Doğru sayıyı ",sayac," denemede buldunuz!")
            self.tahminett.setEnabled(False)
            self.tahminn.setEnabled(False)
            self.ybaslatt.show()
        elif tahmin>sayi:
            self.durum.setText("Tahmininiz doğru sayıdan büyük.")
        elif tahmin<sayi:
            self.durum.setText("Tahmininiz doğru sayıdan küçük.")
        else:
            QtGui.QMessageBox.warning(None,"Geçersiz sayı","Sadece 1 ile 100 arasında bir sayı girebilirsiniz.")    

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "Sayıyı Bul", None))
        self.baslatt.setText(_translate("MainWindow", "Başlat", None))
        self.tahminett.setText(_translate("MainWindow", "Tahmin Et", None))
        self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-weight:600;\">Python-Sayı Tahmin Oyunu </span></p><p>Başlamak için &quot;Başlat&quot; düğmesine basın ve 1-100 arasında bir sayı girin.</p></body></html>", None))
        self.label_2.setText(_translate("MainWindow", "Tahmin:", None))
        self.label_3.setText(_translate("MainWindow", "", None))
        self.hakkinda.setText(_translate("MainWindow", "Hakkında", None))

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

2 个答案:

答案 0 :(得分:1)

在提出问题时,通常包含问题本身的好形式,以及事情表现如何以及预期结果的指示。

要记住global的主要内容是它不会创建变量。它只通知编译器这些名称属于外部作用域(模块级而不是函数级)。因此组合如:

global sayac
sayac=sayac +1

要求已将sayac设置为您可以添加一个的内容。代码实际上没有任何设置它们最初。

此外,baslat_btn似乎至少存在两个问题:

def baslat_btn(self):
    sayac=0
    #...
    sayi=random.randint(0,100)
    #...
    return sayi
    return sayac

首先,在此函数中没有global语句。因此,这两个变量在本地范围内。其次,该函数只能返回一次,因此只返回sayi,尽管看起来这个返回值仍未使用。

最后,你为什么要使用全球范围?似乎所有逻辑都包含在一个Ui_MainWindow对象中;它没有理由不能保持国家。考虑到它与MainWindow的紧密联系,一些编码风格会使它成为QMainWindow的子类。

答案 1 :(得分:0)

我建议尝试在声明变量的地方使用global关键字,然后再使用变量。每当我遇到使用全局变量的问题时,我就会这样做。