0

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

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

4 回答 4

3

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

def mColour(x):
    ...

def mHello(x):
    ...

然后当你想调用函数时:

x = "#000000" 

x = mColour(x)
mhello(x)

根据经验,在函数中定义全局变量是个坏主意(极少数情况是例外)。您希望将本地和全局命名空间分开。出于这个原因,函数允许传递参数。

于 2013-11-08T16:36:00.873 回答
1

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

class Example(object):
    x="00006"

def c():
 print(Example.x)

c()

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

于 2013-11-08T16:39:56.140 回答
1

编辑:现在你的问题更有意义了。因为您的函数连接到这些 UI 控件,所以向它们传递参数变得更加困难。

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

现在,mHello 仍然不能将颜色或结构作为参数,所以你有三个选项。

1)你可以做一些你已经说过不想做的事情。

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

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

(旧答案:)

有两种方法。

编辑:这两个都已经被建议了。

您可以使这两个函数成为同一个类的成员,然后x(您应该将其命名为更具描述性的名称)它们都可以访问而不是全局的。

或者...

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

顺便说一句,我不确定你为什么在你的方法前加上,m但这通常将它们标识为类的成员。他们是吗?

查看代码的其余部分(实际调用这些函数的位置)也会很有帮助。

于 2013-11-08T16:40:30.867 回答
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)
于 2013-11-08T16:37:36.080 回答