因为我已将搜索词设置为第一个函数的全局 - 第二个函数不能访问它 - 如果不是,我将如何使其工作?
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( )
答案 0 :(得分:1)
每个想要更改searchterm
全局变量值的函数都需要声明global searchterm
。 global
语句不会更改变量本身的属性 - 而是更改函数的属性,特别是当前函数设置和获取相关变量名称的值的方式。
您可以从函数内部访问全局变量,而不会将其声明为全局变量,前提是(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()
有了这样说......我确定你知道,一般来说,拥有全局变量是一个坏主意。