我对Python很陌生,目前正在Tkinter中构建一个GUI界面,并有一个完整的工作代码。我认为通过按"Enter"键从键盘上工作按钮会很好。
其代码行为:win.bind('<Return>', testButton.functionName)
然后您只需将"事件"放在功能括号中,又名functionName(event)
一切都很好。
问题是现在当您按下 GUI 界面内的按钮时它不起作用,这意味着我需要复制和重命名其中一个功能才能同时拥有这两个功能。
由于它是相同的代码,因此将其作为模块会更有意义。但是,当我导入模块时,它似乎看不到我的其余代码,并声称我的变量不存在。
这是我如何做到这一点的简化示例。
我的模块另存为模块测试:
def test():
sum = a + b
return sum
主程序:
import moduleTest
a = 10
b = 12
moduleTest.test()
print test()
它一直声称 a 和 b 没有定义。
我显然误解了模块的工作原理,因为当我导入模块时,它应该简单地导入整个代码并执行与此相同的操作:
import moduleTest
a = 10
b = 12
def test():
sum = a + b
return sum
print test()
我误解和做错了什么?
Python 全局变量是每个模块的全局变量,而不是整个程序。
处理此问题的常用方法是不使用全局变量。
对于您的玩具示例,您可以从主模块def test(a, b):
然后调用test(a, b)
,这通常是正确的解决方案,但并不总是合适的。
其他选项包括:
- 使用类,并在创建实例时传入值。
- 将需要共享的全局变量存储在第三个模块中,
main
和moduleTest
都可以import thirdmodule
并作为thirdmodule.a
访问。这通常适用于共享配置值等情况。 - 将全局变量存储为两个代码段都已经可以访问的其他事物的属性。
正如@abarnert指出的,全局变量对每个模块都是全局的。为了解决这个问题,您可以使用:
def test(a, b):
sum = a + b
return sum
和
import moduleTest
a = 10
b = 12
print(moduleTest.test(a, b))
我想指出的是,你不应该sum
调用你的变量,因为这已经是一个你正在覆盖的现有函数。
以下是我的代码的几个独立片段,可以给你一个想法:
item = "SNAKE"
oldString = "-" * (len(item))
blank = "-" * (len(item))
guesses = 10
def gameOn():
global guesses
global oldString
newString = ""
i = 0
x = len(item)
hanged = ""
readString = answerIn.get().upper()
winner = 1
if not readString:
if guesses == 10:
pass
else:
hanged = (HANGMAN[(len(HANGMAN) -1) - guesses])
hangedOutput.config(state=NORMAL)
hangedOutput.delete("1.0",END)
hangedOutput.insert(END,hanged)
hangedOutput.config(state=DISABLED)
error.config(state=NORMAL)
error.delete(0,END)
error.insert(0,"Please enter the value.")
error.config(state=DISABLED)
win = Tk()
answerIn = Entry(win,width = 3, border = 2)
answerIn.focus_set()
answerIn.grid(row=2, column=0, pady = 10, padx = 200, sticky = W)
win.mainloop()
当我把它变成一个模块时,它不仅会询问项目和oldString定义,还会询问tkinter标签中的answerIn,hangedOutput等。