Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 将变量从combobox传递给被调用函数_Python_Tkinter - Fatal编程技术网

Python 将变量从combobox传递给被调用函数

Python 将变量从combobox传递给被调用函数,python,tkinter,Python,Tkinter,我试图将一个变量从tkinter组合框传递到单击“运行”按钮时调用的函数。我对python比较陌生,我尝试的每个选项都会产生一个错误——主要是变量没有定义。我相信这是因为我没有在正确的地方定义它。非常感谢您的帮助 from tkinter import * from tkinter import ttk from URL_Generator import crawl_site listFile = open('regions1.txt','r') root = Tk() root.confi

我试图将一个变量从tkinter组合框传递到单击“运行”按钮时调用的函数。我对python比较陌生,我尝试的每个选项都会产生一个错误——主要是变量没有定义。我相信这是因为我没有在正确的地方定义它。非常感谢您的帮助

from tkinter import *
from tkinter import ttk
from URL_Generator import crawl_site

listFile = open('regions1.txt','r')

root = Tk()
root.configure()
varItems = StringVar(root, value='')

class MainWindow(Frame):
    def __init__(self,master = None):
        Frame.__init__(self,master)
        self.master = master
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        """Create Window Layout"""
        self.label = Label(self, text="List Items").pack()
        self.itemCombo = ttk.Combobox(self, width = 16, textvariable = varItems)
        self.itemCombo.bind("<Return>", self.itemCombo_onEnter)
        self.itemCombo.bind('<<ComboboxSelected>>',self.itemCombo_onEnter)
        self.itemCombo['values'] = [l.strip() for l in listFile.readlines()]
        self.itemCombo.pack()
        self.blank = Label(self,text='').pack()

        """I want to pass the value selected in the combobox to the crawl_region() function when pushing Run"""

        self.RunButton = Button(self, text="Run",command = crawl_site.crawl_region(region))
        self.RunButton.pack()

    def itemCombo_onEnter(self,event):
        varItems.set(varItems.get().lower().strip())
        mytext = varItems.get().strip()
        vals = self.itemCombo.cget('values')
        self.itemCombo.select_range(0,END)
        print(mytext)
        region = mytext

        """I want to pass mytext to the function called when pushing Run"""

        if not vals:
            self.itemCombo.configure(values = (mytext,))
        elif mytext not in vals:
            with open('regions1.txt', 'w') as f:
                self.itemCombo.configure(values=vals + (mytext,))
                f.write("\n".join(vals + (mytext,)))
                f.close()
        return 'break'

app = MainWindow(root)
root.mainloop()
传递的区域[]会立即返回,但当我进行选择或按下运行按钮时,不会发生任何事情。

请尝试以下代码。 我创建了一个类属性
self.mytext
,它是在输入组合按钮
itemCombo\u oneter
时设置的。按下按钮时,调用
onRunButton
函数。如果设置了
self.mytext
,它将调用
crawl\u区域
函数,并将
self.mytext
作为参数

from tkinter import *
from tkinter import ttk
from URL_Generator import crawl_site

listFile = open('regions1.txt','r')

root = Tk()
root.configure()
varItems = StringVar(root, value='')

class MainWindow(Frame):
    def __init__(self,master = None):
        Frame.__init__(self,master)
        self.master = master
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        """Create Window Layout"""
        self.label = Label(self, text="List Items").pack()
        self.itemCombo = ttk.Combobox(self, width = 16, textvariable = varItems)
        self.itemCombo.bind("<Return>", self.itemCombo_onEnter)
        self.itemCombo.bind('<<ComboboxSelected>>',self.itemCombo_onEnter)
        self.itemCombo['values'] = [l.strip() for l in listFile.readlines()]
        self.itemCombo.pack()
        self.blank = Label(self,text='').pack()

        """I want to pass the value selected in the combobox to the crawl_region() function when pushing Run"""

        self.RunButton = Button(self, text="Run",command = self.onRunButton)
        self.RunButton.pack()

    def onRunButton(self):
        if self.mytext:
            crawl_site.crawl_region(self.mytext)        

    def itemCombo_onEnter(self,event):
        varItems.set(varItems.get().lower().strip())
        mytext = varItems.get().strip()
        vals = self.itemCombo.cget('values')
        self.itemCombo.select_range(0,END)
        print(mytext)

        self.mytext = mytext
        """I want to pass mytext to the function called when pushing Run"""

        if not vals:
            self.itemCombo.configure(values = (mytext,))
        elif mytext not in vals:
            with open('regions1.txt', 'w') as f:
                self.itemCombo.configure(values=vals + (mytext,))
                f.write("\n".join(vals + (mytext,)))
                f.close()
        return 'break'

app = MainWindow(root)
root.mainloop()
这会立即调用方法
crawl\u region
,并将该区域作为参数,并尝试将按钮的回调设置为该方法的结果


另一种在不创建其他函数的情况下“修复”问题的方法是使用lambda,但我认为我的方法更具可读性。

如果您遇到错误,应该显示出来。@DanielRoseman-感谢您的快速响应!我已经编辑了这个问题。在这个示例中,我没有得到错误,但是函数在没有按下按钮的情况下被调用,并且返回一个空列表,因为还没有进行选择。我相信我的问题在于代码的顺序。谢谢你的帮助,特别是解释为什么我的代码不起作用(这是一个巨大的帮助)!当我运行更正后的代码时,我得到一个“NameError:name'onRunButton'未定义错误。你能帮我克服这个错误吗?@Justin Hill,
onRunButton
是一个类方法,所以当你声明
self.RunButton
时,你需要
self.onRunButton
作为
命令
参数。
from tkinter import *
from tkinter import ttk
from URL_Generator import crawl_site

listFile = open('regions1.txt','r')

root = Tk()
root.configure()
varItems = StringVar(root, value='')

class MainWindow(Frame):
    def __init__(self,master = None):
        Frame.__init__(self,master)
        self.master = master
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        """Create Window Layout"""
        self.label = Label(self, text="List Items").pack()
        self.itemCombo = ttk.Combobox(self, width = 16, textvariable = varItems)
        self.itemCombo.bind("<Return>", self.itemCombo_onEnter)
        self.itemCombo.bind('<<ComboboxSelected>>',self.itemCombo_onEnter)
        self.itemCombo['values'] = [l.strip() for l in listFile.readlines()]
        self.itemCombo.pack()
        self.blank = Label(self,text='').pack()

        """I want to pass the value selected in the combobox to the crawl_region() function when pushing Run"""

        self.RunButton = Button(self, text="Run",command = self.onRunButton)
        self.RunButton.pack()

    def onRunButton(self):
        if self.mytext:
            crawl_site.crawl_region(self.mytext)        

    def itemCombo_onEnter(self,event):
        varItems.set(varItems.get().lower().strip())
        mytext = varItems.get().strip()
        vals = self.itemCombo.cget('values')
        self.itemCombo.select_range(0,END)
        print(mytext)

        self.mytext = mytext
        """I want to pass mytext to the function called when pushing Run"""

        if not vals:
            self.itemCombo.configure(values = (mytext,))
        elif mytext not in vals:
            with open('regions1.txt', 'w') as f:
                self.itemCombo.configure(values=vals + (mytext,))
                f.write("\n".join(vals + (mytext,)))
                f.close()
        return 'break'

app = MainWindow(root)
root.mainloop()
self.RunButton = Button(self, text="Run",command = crawl_site.crawl_region(region))