global宣言は一度だけすればいいというものではないのか
初歩的なことなのですが、global
変数に関する問題です。
from PySide import QtGui
import sys
class GlobalTest(QtGui.QTextEdit):
def __init__(self,parent=None):
super(GlobalTest,self).__init__(parent=None)
def closeEvent(self,event):
if g_is_modified == True:
message = QtGui.QMessageBox().warning(None,"Warning-警告","書き換えられた内容があります。このまま閉じてもよろしいですか?\n",QtGui.QMessageBox.Ok,QtGui.QMessageBox.Cancel)
if message == QtGui.QMessageBox.Ok:
pass
else:
return
print(15,global_widget.parent() == self)
return QtGui.QTextEdit.closeEvent(self,event)
def focusInEvent(self,event):
print("focus キタ")
global g_is_modified
g_is_modified = True
global_widget.setParent(self)
return QtGui.QTextEdit.focusInEvent(self,event)
def main():
try:
QtGui.QApplication([])
except Exception as e:
print(19,e)
global g_is_modified
g_is_modified = False
global global_widget
global_widget = QtGui.QWidget()
glob = GlobalTest()
glob.show()
sys.exit(QtGui.QApplication.exec_())
if __name__ == "__main__":
main()
main()
関数内で、一度、global
宣言をし、g_is_modified = False
を入れ込んでいます。
この変数の値は、focusInEvent
に入った時に、上書きされるようにしています。
一方で、もう一つ、global
宣言をし、次は、global
ウィジェットをグローバル化しています。同様に、このウィジェットの親を、focusInEvent
に入った時にGlobalTest
に設定しています。
結果は、
15 True
16 True
で問題ありません。これは、解決後の問題です。(最初はなぜ上書きできないのだろうということが疑問でしたが、どちらでもglobal宣言をしたらOKでした。)
解決前は、focusInEvent
内では、global
宣言をしておりませんでした。
def focusInEvent(self,event):
print("focus キタ")
g_is_modified = True
global_widget.setParent(self)
return QtGui.QTextEdit.focusInEvent(self,event)
結果
15 False
16 True
g_is_modified
の値は上書きされませんでした。
g_is_modified
は、再度global
宣言をしなければ値が上書きされることはありませんが、widget
は、一度global
宣言をすれば、値が更新されました。この違いはなんでしょうか?単なる変数と、クラスの一メソッドなので、全くの別物のため、なんとなく理由はわかりますが、わかりやすく説明していただくことは出来ますか?