繁体   English   中英

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

[英]Python- How can I access a variable outside of a function?

我正在尝试从函数外部访问变量。 我添加了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_())

提出问题时,通常将问题本身包括在内,以及指示事物如何意外运行以及预期结果是一种很好的形式。

关于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的子类。

我建议尝试在声明变量的位置和要使用变量之前都使用global关键字。 每当使用全局变量遇到问题时,我都会这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM