我一直在尝试使用我在另一个函数中定义的变量,但我不想使用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。
我已按要求添加其余代码。
答案 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
作为前缀,但通常会将它们标识为类的成员。是吗?
查看代码的其余部分也很有帮助,您实际上调用这些函数。