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

Mik*_*ink 4 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()
Run Code Online (Sandbox Code Playgroud)

orl*_*rlp 9

用于global修改函数外部的变量:

def update_text():
    global current_movie
    current_movie= random.randint(0, 100)
    print(current_movie)
Run Code Online (Sandbox Code Playgroud)

但是,不要使用global. 这通常是一种代码味道

  • 告诉某人唯一的解决方案是使用“global”,然后给出不要使用“global”的建议对于任何寻求此问题帮助的人来说没有帮助。如果您要明确声明“不要使用全局”,至少给出一个替代方案的提示。 (11认同)

bru*_*ers 5

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

关键是:您应该首先独立于用户界面设计域模型,然后编写调用域模型的用户界面代码.在这种情况下,您的UI是一个Tkinter GUI,但相同的域模型应该能够使用命令行UI,Web UI或其他任何东西.

注意:对于python 3.x,替换Tkintertkinter(小写),你可以删除object基类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()
Run Code Online (Sandbox Code Playgroud)