Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何定义通过另一个函数内的for循环创建的全局变量?_Python_Python 2.7_For Loop_Tkinter_Global Variables - Fatal编程技术网

Python 如何定义通过另一个函数内的for循环创建的全局变量?

Python 如何定义通过另一个函数内的for循环创建的全局变量?,python,python-2.7,for-loop,tkinter,global-variables,Python,Python 2.7,For Loop,Tkinter,Global Variables,我发现了错误 NameError:未定义全局名称“spinbox\u 0” 当我试图从Tkinter Spinbox中获取值并打印出来时。spinbox位于另一个函数中,如果可能的话,我会定义它,但是我不知道如何在这个例子中定义它,因为spinbox的名称和数量是由for循环创建的,具体取决于主题列表的长度 我认为只发布代码进行调试会更容易。按下按钮2按钮时会显示错误代码 目前,我只想检索spinbox\u 0值并打印它。之后,我将使用另一个循环获取所有spinbox值 from Tkinter

我发现了错误

NameError:未定义全局名称“spinbox\u 0”

当我试图从Tkinter Spinbox中获取值并打印出来时。spinbox位于另一个函数中,如果可能的话,我会定义它,但是我不知道如何在这个例子中定义它,因为spinbox的名称和数量是由for循环创建的,具体取决于主题列表的长度


我认为只发布代码进行调试会更容易。按下
按钮2
按钮时会显示错误代码

目前,我只想检索
spinbox\u 0
值并打印它。之后,我将使用另一个循环获取所有spinbox值

from Tkinter import Tk, Button, Spinbox, Label

## Create a window
window = Tk()

## Give the window a title
window.title('Tester')

names = ['Name 1','Name 2','Name 3','Name 4','Name 5','Name 6','Name 7']

## Define the actions for when button one is pushed
def button1():
    print "Button one pushed"
## Create the Spinboxes for each name in the list
    spinbox_list = []
    spinbox_grid_list = []
    for number, name in enumerate(names):
        spinbox = 'spinbox_' + str(number) + ' = Spinbox(window, width = 3, from_=0, to=10)'
        spinbox_grid = 'spinbox_' + str(number) + '.grid(padx = 0, pady = 0, row = 13, column = '+ str(number) +')'
        spinbox_list.append(spinbox)
        spinbox_grid_list.append(spinbox_grid)
        spinbox_option = {'spinbox_{}'.format(i):e for i, e in enumerate(spinbox_list)}
    spinbox_option_string = '\n'.join(spinbox_option.values())
    spinbox_grid_option = {'spinbox_grid_{}'.format(i):e for i, e in enumerate(spinbox_grid_list)}
    spinbox_grid_option_string = '\n'.join(spinbox_grid_option.values())
    exec(spinbox_option_string)
    exec(spinbox_grid_option_string)
## Create a second button
    button_two = Button(window, text = 'Button two', command = button2, width = 20)
    button_two.grid(pady = 10, padx = 2, row = 14, columnspan = 9, sticky = "S") 

## Define the actions for when button two is pushed (print the spinbox values)
def button2():
    print 'spinbox_0 = ' + (spinbox_0.get())
    ## spinbox_0 is Just an example. I need all spinboxes to print out their
    ## values here somehow

button_one = Button(window, text = 'Button one', command = button1, width = 20)
button_one.grid(pady = 2, padx = 2, row = 1, columnspan = 9, sticky = 'S')

window.mainloop()

回避全局变量是个坏主意这一事实™, 这里有一个方法。创建全局变量,然后不要在函数中重新赋值。现在,您可以在
按钮2
函数中循环该选项。由于您需要的是Spinbox对象,而不是其描述,请保存该对象

*顺便说一句,通过避免执行
exec
,您可以大大简化
按钮1
功能

spinboxes = []


# Define the actions for when button one is pushed
def button1():
    print "Button one pushed"
    # Create the Spinboxes for each name in the list
    spinbox_grid_list = []
    for number, name in enumerate(names):
        spinboxes.append(Spinbox(window, width=3, from_=0, to=10))
        spinboxes[number].grid(padx=0, pady=0, row=13, column=number)
    button_two = Button(window, text='Button two', command=button2, width=20)
    button_two.grid(pady=10, padx=2, row=14, columnspan=9, sticky="S")

# Define the actions for when button two is pushed (print the spinbox values)
def button2():
    for i, spinbox in enumerate(spinboxes):
        print 'spinbox_{} = '.format(i) + (spinbox.get())
我假设
按钮1
只调用过一次。否则,每次按下该按钮时,都会将新的
spinbox
es添加到全局列表中。要绕过这个问题:

def button1():
    print "Button one pushed"

    global spinboxes
    spinboxes = []
    ...

我们使用
global
关键字来重新分配全局对象,每次调用函数时将其清除。

“我认为只发布代码进行调试会更容易。”更具体地说,您应该发布一个。这是一个分解版本,您已经创建了spinbox列表,并且没有使用它的功能按钮2,您直接尝试访问列表中的一个元素。将列表设为全局并访问列表中的项目list@Keval是的,这就是我的答案。不幸的是,我现在得到了一个不同的错误:“文件”C:/Users/thejo/Dropbox/Uni/IFB104/Test.py”,第35行,在按钮2中打印'spinbox{}='。format(I)+(spinbox.get())AttributeError:'str'对象没有属性'get'有什么办法吗?是的,我看到了并编辑了我的回复。这是因为您正在使用字符串调用
get
。只需使用字符串的值。啊,我看到它只是在打印我的spinbox标签值,这些值是我用来在窗口中创建实际spinbox的。我必须从Tkinter窗口中“获取”输入到微调框中的数值。这是您想要的行为,还是缺少什么?不,我正在尝试从Tkinter窗口中的实际框中获取数值并将其全部打印出来。Spinbox似乎必须以大写字母开头。我尝试过:“def button2():for I in spinbox_list:print spinbox.get()”但我得到了错误:“unbound method get()必须以spinbox实例作为第一个参数调用(取而代之的是什么都没有)”