Python - 在函数外部更改变量而不返回

新手上路,请多包涵

我刚开始学习Python,就遇到了这个问题。我想在方法内部设置一个变量,但该变量在方法外部。

该方法由一个按钮激活。然后我想从按下另一个按钮时设置的那个变量中获取值。问题是我从方法内部放入变量中的值不会保留。我将如何解决这个问题?

代码在下面。 currentMovie 是我尝试更改的变量。当我使用方法 UpdateText() 按下按钮时,它会像预期的那样打印出一个随机数。但是当我按下激活按钮时 UpdateWatched() 它打印出0。所以我假设变量永远不会被设置。

 import random
from tkinter import *

currentMovie = 0

def UpdateText():
    currentMovie = random.randint(0, 100)
    print(currentMovie)

def UpdateWatched():
    print(currentMovie)

root = Tk()
root.title("MovieSelector9000")
root.geometry("900x600")
app = Frame(root)
app.grid()
canvas = Canvas(app, width = 300, height = 75)
canvas.pack(side = "left")
button1 = Button(canvas, text = "SetRandomMovie", command = UpdateText)
button2 = Button(canvas, text = "GetRandomMovie", command = UpdateWatched)
button1.pack(anchor = NW, side = "left")
button2.pack(anchor = NW, side = "left")
root.mainloop()

原文由 anonymous-dev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 416
2 个回答

这是一个简单的(python 2.x)示例,说明如何 1 使用全局变量和 2 使用(简单的)域模型类。

重点是:您应该首先独立于用户界面设计领域模型,然后编写调用领域模型的用户界面代码。在这种情况下,您的 UI 是 Tkinter GUI,但相同的域模型应该能够与命令行 UI、Web UI 或其他任何东西一起工作。

NB : for python 3.x, replace Tkinter with tkinter (lowercase) and you can get rid of the object base class for Model

 import random
from Tkinter import *

class Model(object):
    def __init__(self):
        self.currentMovie = 0

    def UpdateCurrentMovie(self):
        self.currentMovie = random.randint(0, 100)
        print(self.currentMovie)

    def UpdateWatched(self):
        print(self.currentMovie)

    def ExampleWithArgs(self, arg):
        print("ExampleWithArg({})".format(arg))

def main():
    model = Model()
    root = Tk()
    root.title("MovieSelector9000")
    root.geometry("900x600")
    app = Frame(root)
    app.grid()
    canvas = Canvas(app, width = 300, height = 75)
    canvas.pack(side = "left")
    button1 = Button(canvas, text = "SetRandomMovie", command=model.UpdateCurrentMovie)
    button2 = Button(canvas, text = "GetRandomMovie", command=model.UpdateWatched)
    button3 = Button(canvas, text = "ExampleWithArg", command=lambda: model.ExampleWithArgs("foo"))
    button1.pack(anchor = NW, side = "left")
    button2.pack(anchor = NW, side = "left")
    button3.pack(anchor = NW, side = "left")
    root.mainloop()

if __name__ == "__main__":
    main()

原文由 bruno desthuilliers 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 global 修改函数外的变量:

 def UpdateText():
    global currentMovie
    currentMovie = random.randint(0, 100)
    print(currentMovie)

但是,不要使用 global 。一般是 代码味道

原文由 orlp 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏