【问题标题】:Returning a selected value from a dynamically populated combobox as a global variable?从动态填充的组合框中返回选定的值作为全局变量?
【发布时间】:2019-11-26 09:27:23
【问题描述】:

我正在尝试自动化一些工作来处理从 SQL 引入的数据。在我的完整代码开始时,我从网站上的其他地方找到并更改了以下类,以充当流畅的界面,以便其他人也可以使用该代码。

这样做的目的是从选项中检索所需的“MPAN”和年份。组合框完全按照我的意愿填充,但是当尝试将所选值作为全局变量检索时出现问题,并在单击“提交”时关闭 GUI,因为它没有任何反应并且没有获得值,但是有没有产生错误。

我的假设是我的“getMPAN”函数出错了,尽管我对这个级别的 tkinter 不是很有经验,所以会非常感谢你。为简单起见,我添加了类别字典作为模拟数据。

b2=[[2018],[2019],[2020],[2021],[2022],[2023],[2024],[2025]]
category = {'home': ['utilities','rent','cable'],
    'car': ['gas','oil','repairs'],
    'rv':['parks','maintenance','payment']}
params=''
mpan=''
year=''

class Application(Frame):

    def __init__(self, master=None, Frame=None):
        Frame.__init__(self, master)
        super(Application,self).__init__()
        self.grid(column = 5,row = 20,padx = 50,pady = 50)
        self.createWidgets()

    def getUpdateData(self,  event):
        self.AccountCombo['values'] = category[self.CategoryCombo.get()]
        self.AccountCombo.current(0)

    def createWidgets(self):
        tk.Label(text = 'Area Code:').grid(row = 2,column = 1,padx = 10)
        tk.Label(text = 'MPAN:').grid(row = 4,column = 1,padx = 10)
        tk.Label(text = 'Year:').grid(row = 6, column = 1, padx = 10)
        self.AccountCombo = ttk.Combobox( width = 15)
        self.AccountCombo.grid(row = 5,column = 1,pady = 25,padx = 10)

        self.CategoryCombo = ttk.Combobox(width = 15,  values = list(category.keys()))
        self.CategoryCombo.bind('<<ComboboxSelected>>', self.getUpdateData)
        self.CategoryCombo.grid(row = 3,column = 1,padx = 10,pady = 25)

        self.YearCombo = ttk.Combobox(width = 15, values = b2)
        self.YearCombo.grid(row = 7, column = 1, padx = 10, pady = 25)
        self.YearCombo.current(0)

    def getMPAN(self):
        mpan=self.AccountCombo.get()
        year=self.YearCombo.get()
        self.destroy()

        global params
        params=[mpan,year]

w=tk.Button(Application(), text='Submit', command=Application().getMPAN)
w.grid(row=8, column=1)

app = Application()
app.master.title('MPAN Selector')
app.mainloop()

这是我第一次在网站上发帖,如果我遗漏了任何细节,我深表歉意。我见过类似的问题,但没有针对这种情况的解决方案。

【问题讨论】:

    标签: python class tkinter combobox global-variables


    【解决方案1】:

    弄清楚我哪里出错了。

    需要将按钮带入 createWidgets 函数,以便正确地从 ComboBox 中获取所选值。

    至于使用按钮命令关闭小部件,我只需将以下行添加到 init

    self.master=master
    

    然后在getMPAN函数中将destroy改为:

    self.master.destroy()
    

    我确定这是比较草率的修复,但总的来说这是我的代码:

    b2=[[2018],[2019],[2020],[2021],[2022],[2023],[2024],[2025]]
    category = {'home': ['utilities','rent','cable'],
        'car': ['gas','oil','repairs'],
        'rv':['parks','maintenance','payment']}
    params=''
    mpan=''
    year=''
    
    class Application(tk.Frame):
    
        def __init__(self, master=None, Frame=None):
            Frame.__init__(self, master)
            self.master=master
            super(Application,self).__init__()
            self.grid(column = 5,row = 20,padx = 50,pady = 50)
            self.createWidgets()
    
        def getUpdateData(self,  event):
            self.AccountCombo['values'] = category[self.CategoryCombo.get()]
            self.AccountCombo.current(0)
    
        def createWidgets(self):
            tk.Label(text = 'Area Code:').grid(row = 2,column = 1,padx = 10)
            tk.Label(text = 'MPAN:').grid(row = 4,column = 1,padx = 10)
            tk.Label(text = 'Year:').grid(row = 6, column = 1, padx = 10)
            self.AccountCombo = ttk.Combobox( width = 15)
            self.AccountCombo.grid(row = 5,column = 1,pady = 25,padx = 10)
    
            self.CategoryCombo = ttk.Combobox(width = 15,  values = list(category.keys()))
            self.CategoryCombo.bind('<<ComboboxSelected>>', self.getUpdateData)
            self.CategoryCombo.grid(row = 3,column = 1,padx = 10,pady = 25)
    
            self.YearCombo = ttk.Combobox(width = 15, values = b2)
            self.YearCombo.grid(row = 7, column = 1, padx = 10, pady = 25)
            self.YearCombo.current(0)
    
            button=ttk.Button(self, text='Submit', command=self.getMPAN)
            button.grid(row=9, column=1)
    
        def getMPAN(self):
            mpan=self.AccountCombo.get()
            year=self.YearCombo.get()
            self.master.destroy()
    
            global params
            params=[mpan,year]
    
    w=tk.Button(Application(), text='Submit', command=Application().getMPAN)
    w.grid(row=8, column=1)
    
    app = Application()
    app.master.title('MPAN Selector')
    app.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多