Python需要访问从另一个函数在函数中创建的变量

时间:2014-11-09 20:54:35

标签: python python-3.x tkinter

因为我已将搜索词设置为第一个函数的全局 - 第二个函数不能访问它 - 如果不是,我将如何使其工作?

import sys
import os.path
from tkinter import *
import math

def setupsearch():
    exist = os.path.isfile('messages.txt')
    if exist == True:
        global searchterm
        gui2 = Toplevel(master=gui)
        Label(gui2, text = "Search Term").grid(row = 0)
        searchterm = Entry(gui2).grid(row = 1)
        Button(gui2, text="Search", command = search).grid(row = 2)
    else:
        labelprint = "No Stored Messages"
        add = Label(gui, text = labelprint, width = 30)
        add.grid(row = 2, column =2)

def search():
    searchterm = 
    with open('messages.txt', 'r') as inF:
        i = 1
        for line in inF:
            if searchterm in line:
                print("found it in line " + str(i))
                i = i + 1
            else:
                print("Not in line " + str(i))
                i = i + 1  

gui = Tk()

Button(gui, text="Retriever", command=setupsearch).grid(row = 5, column = 0)

mainloop( )

3 个答案:

答案 0 :(得分:1)

每个想要更改searchterm全局变量值的函数都需要声明global searchtermglobal语句不会更改变量本身的属性 - 而是更改函数的属性,特别是当前函数设置和获取相关变量名称的值的方式。

您可以从函数内部访问全局变量,而不会将其声明为全局变量,前提是(a)没有与其冲突的同名局部变量,并且(b)您不会需要改变其全球价值。

如果您不说global searchterm但是然后将某些内容分配给searchterm,则该功能只会创建该名称的本地变量。

答案 1 :(得分:1)

setupsearch使用

        Button(gui2,
               text="Search",
               command = lambda: search(thesearchterm)).grid(row = 2)

当然会修改search

的定义
def search(searchterm):
    ...

请注意,我使用lambda: search(the_searchterm)是有充分理由的,因为searchterm = Entry(...)是一个小部件。请阅读Tkinter.Entry上的教程,或者只是在shell提示符下使用man Entry(当然,您必须已经为tk安装了文档)。

答案 2 :(得分:0)

您希望通过声明:

开始您的第二个功能
def search():
    global searchterm
    ## rest of function goes here

然后,您就可以从search()

中访问全局变量

有了这样说......我确定你知道,一般来说,拥有全局变量是一个坏主意。