2014-07-13 2 views
0

함수 외부에서 변수에 액세스하려고합니다. 나는 global sayacglobal sayi을 추가했는데 (다른 질문과 관련한 것을 보았습니다.), 여전히 액세스 할 수 없습니다. 저는 여기에 문제가 발생하고있는 프로그램의 일부는 다음과 같습니다Python - 함수 외부에서 변수에 액세스하려면 어떻게해야합니까?

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

전역 변수를 사용하여 프로그램을 수정하는 대신, 변수를 전달하고 함수에서 변수를 반환하는 것이 좋습니다. 전역 변수는 위험하며 일반적으로 불분명하고 추악한 비 모듈 코드로 이어집니다. – xander

+0

클래스에서 전역을 사용하는 이유는 무엇입니까? 속성을 만들 수 없습니까? –

답변

0

질문을 할 때, 질문 자체를 포함시키는 것이 일반적으로 좋은 형태이며, 예기치 않게 행동하는 방법과 예상되는 것의 표시입니다.

global에 대해 기억해야 할 주요 사항은 변수를 만들지 않는다는 것입니다. 그 이름은 외부 범위 (함수가 아닌 모듈 수준)에 속한다는 것을 컴파일러에만 알립니다. 예를 들어

global sayac 
sayac=sayac +1 

과 같은 조합은 sayac에 이미 추가 할 수있는 것으로 설정해야합니다. 코드에는 실제로 초기에 설정하는 것이 없습니다. 이 기능에 더 global 문 없었다,

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

첫째 :

는 또한, baslat_btn 적어도 두 가지 문제가있을 나타납니다. 따라서 두 변수는 범위가 로컬입니다. 둘째로이 함수는 한 번만 반환 할 수 있으므로 sayi 만 반환합니다.하지만이 반환 값은 사용되지 않습니다.

마지막으로 왜 글로벌 범위를 사용하고 있습니까? 귀하의 모든 논리가 하나의 Ui_MainWindow 객체에 포함되어있는 것으로 보입니다. 국가도 보유 할 수있는 이유가 없습니다. MainWindow와 얼마나 밀접한 관계가 있는지를 고려해 볼 때, 몇몇 코딩 스타일은 QMainWindow의 서브 클래스가 될 수 있습니다.

+0

QtDesigner와 pyuic을 사용하여 python 코드로 양식을 변환 했으므로 아무 것도 변경하지 않았습니다. 답장을 보내 주셔서 감사합니다. – user3755771

0

I 글로벌 키워드를 사용하려고 시도하는 것이 좋습니다 모두 당신은 변수를 선언 어디에 당신이 사용하려는 전에 변수. 전역 변수를 사용할 때마다 그렇게합니다.

관련 문제