繁体   English   中英

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

[英]Python Need Access to variable created in a function from another function

由于我已将第一个功能的搜索词设置为全局-第二个功能不应该能够访问它-如果没有,我将如何使其工作?

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( )

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

您可以不用从函数内部访问全局变量而无需声明它为全局变量,只要(a)没有同名的局部变量与其冲突,并且(b)无需更改其全局变量值。

如果你不说, global searchterm ,但然后分配东西searchterm ,该功能将简单地创建一个同名的局部变量。

在您的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安装了文档)。

您想通过声明以下内容来开始您的第二个功能:

def search():
    global searchterm
    ## rest of function goes here

然后,您将可以在search()访问全局变量

话虽如此……我敢肯定,总的来说,拥有全局变量是一个坏主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM