不想使用全局。蟒蛇

时间:2013-11-08 16:31:56

标签: python python-3.x

我一直在尝试使用我在另一个函数中定义的变量,但我不想使用Global。

import sys
from tkinter import *
from tkinter import messagebox
from tkinter import colorchooser
from tkinter import filedialog

x = "#000000"
#colour chooser
def mColour():
    color = colorchooser.askcolor()
    mlabel2 = Label(mGui,text=color).pack()
    messagebox.showinfo(title = "Colour",message = "This feature has not been fully added yet.")
    x = color[1]
    print (color[1])
    return x
#printing message
def mhello():
    mtext = ment.get()
    mlabel2 = Label(mGui,text=mtext, fg = (b)) # color varible = x
    mlabel2.pack()
#message
def mNew():
    messagebox.showerror(title = "(New) Error",message = "This feature has not been added yet.")
def mAbout():
    messagebox.showinfo(title = "About",message = "This Jono's susure personal data base. (Will be)")
#question message
def mQuit():
    mExit = messagebox.askokcancel(title = "Quit",message = "Are you sure")
    if mExit > 0:
        mGui.destroy()
#open
def mOpen():
    myopen = filedialog.askopenfile()
    mlabel3 = Label(mGui,text=myopen).pack()
    messagebox.showinfo(title = "Open",message = "This feature has not been fully added yet.")


mGui = Tk()
ment = StringVar()

mGui.geometry("300x200+100+100")
mGui.title("Jono's Clock")

mlable = Label(mGui,text="My Label",fg = "red").pack()
mbutton = Button(mGui,text ="OK",command = mhello,fg = "red").pack()

mEntry = Entry(mGui,textvariable=ment).pack()



# Menu

menubar = Menu(mGui)

filemenu = Menu(menubar, tearoff = 0)
filemenu.add_command(label = "New",command = mNew)
filemenu.add_command(label = "Open",command = mOpen)
filemenu.add_command(label = "Colour",command = mColour)
filemenu.add_command(label = "About",command = mAbout)
filemenu.add_command(label = "Quit",command = mQuit)


menubar.add_cascade(label = "File",menu = filemenu)
mGui.config(menu = menubar)



mGui.mainloop()

我在Windows 7上使用python 3.3。

我已按要求添加其余代码。

4 个答案:

答案 0 :(得分:3)

正如评论所建议的那样,将变量x作为参数传递给函数会很好。

def mColour(x):
    ...

def mHello(x):
    ...

然后当你想调用这些函数时:

x = "#000000" 

x = mColour(x)
mhello(x)

根据经验,在函数内定义全局变量是一个坏主意(在极少数情况下是异常)。您希望保持本地和全局命名空间分离。由于这个原因,函数允许传递参数。

答案 1 :(得分:1)

#colour chooser
def mColour(x):
    color = colorchooser.askcolor()
    mlabel2 = Label(mGui,text=color).pack()
    messagebox.showinfo(title = "Colour",message = "This feature has not been fully added yet.")
    x = color[1]
    print (color[1]) # Just a test
    return x

x = "#000000" # default text colour
mColour(x)

答案 2 :(得分:1)

您可以使用类,因为我认为没有办法从另一个函数访问局部变量。

class Example(object):
    x="00006"

def c():
 print(Example.x)

c()

所以在这里你根本没有使用任何全局变量

答案 3 :(得分:1)

编辑:现在你的问题更有意义了。由于您的函数已连接到这些UI控件,因此将参数传递给它们变得更加困难。

因此,您需要一种结构来存储从UI获得的这些值。然后,当mhello()需要它时,它可以访问一个函数,该函数可以从您选择使用的任何结构中获取颜色。

现在,mHello仍然无法将颜色或结构作为参数,因此您有三种选择。

1)你可以做一些全球性的事情,你已经说过你不想这样做。

2)你可以创建一些静态的东西,这样你就可以从mHello中访问同一个实例。

3)但我认为最好的答案是使用常用的结构:使UI成为一个类。它具有成员函数可以访问的成员变量。如果mColor和mHello是同一个类的成员,那么他们可以非常轻松地访问他们需要的任何内容。然后,您创建了一些在UI类之外获取内容的方法,以便可以通过您正在编写的任何应用程序来访问,处理和返回它。

(旧答案:)

有两种方式。

编辑:两者都已被建议。

你可以让这两个函数成为同一个类的成员,然后x(你应该更具描述性的名称)可以被访问,而不是全局的。

或者...

您可以(根据其他评论员的建议)将x作为参数传递给您的第二个函数。 mColor()甚至返回x,这意味着您可以将该值存储在另一个变量中,然后传递给mhello()。

顺便说一下,我不确定为什么你的方法用m作为前缀,但通常会将它们标识为类的成员。是吗?

查看代码的其余部分也很有帮助,您实际上调用这些函数。

相关问题