Python>;tkinter:如何从笔记本框架内的面板获取值

Python>;tkinter:如何从笔记本框架内的面板获取值,python,tkinter,Python,Tkinter,我刚刚开始用python编程,我正在用它制作一个带有GUI(使用tkinter)的小程序,可以从excel文件(使用openpyxl)获取数据。让用户在必要时更改内容,然后使用按钮将条目中的数据写入数据文件(.dat)(最好是更新defaultdict数组中的值,然后写入.dat文件),并使用建模语言(pyomo)使用提供的数据创建模型,并使用cbc解算器进行求解 现在,我已经完成了模型的制作,图形界面(由excel文件中的数据填充)。但是,我无法取回entries字段中的数据(以写入和更新de

我刚刚开始用python编程,我正在用它制作一个带有GUI(使用tkinter)的小程序,可以从excel文件(使用openpyxl)获取数据。让用户在必要时更改内容,然后使用按钮将条目中的数据写入数据文件(.dat)(最好是更新defaultdict数组中的值,然后写入.dat文件),并使用建模语言(pyomo)使用提供的数据创建模型,并使用cbc解算器进行求解

现在,我已经完成了模型的制作,图形界面(由excel文件中的数据填充)。但是,我无法取回entries字段中的数据(以写入和更新defaultdicts数组)。我理解stackoverflow上的简单示例(使用entry.get()),但它对我的示例不起作用(可能是因为我使用了notbook选项卡、面板和框架,或者我弄糟了一些东西)

我使用笔记本选项卡而不是一页,因为在完整的程序中,我将有更多(大约5)种其他类别的数据。最后,我想让程序能够适应输入(因此它不知道是否会有3个、8个或10个设施)。我使用python版本3.5.1。以下是excel文件的链接:


我找到了解决这个问题的方法:


我为每个入口字段做了一个全局条目

我发现了解决这个问题的方法:


我为每个入口字段创建了一个全局条目

TL;博士:太多的信息和代码。请编辑您的帖子,以包含证明您的问题所需的最少信息和代码。Openpyxl和pyomo以及cbc解算器似乎与手头的问题无关,因此无需提及。TL;博士:太多的信息和代码。请编辑您的帖子,以包含证明您的问题所需的最少信息和代码。Openpyxl和pyomo以及cbc解算器似乎与手头的问题无关,因此无需提及。
    import sys
    from tkinter import ttk
    import tkinter as tk
    import openpyxl
    import numpy as np
    import os
    from collections import defaultdict
    from facility_panel import *

    class App(tk.Tk):


        def __init__(self):
            tk.Tk.__init__(self)
            self.getdata()
            self.tabes()
            button_box = tk.Frame(self)
            tk.Button(button_box, text='Create Planning', command=self.on_ok_clicked).grid(pady=15)
            button_box.pack()

            self.create_menu()
            self.set_keybindings()

        @staticmethod
        def center_on_screen(toplevel):
            toplevel.update_idletasks()
            w = toplevel.winfo_screenwidth()
            h = toplevel.winfo_screenheight()
            size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
            x = w/2 - size[0]/2
            y = h/2 - size[1]/2
            toplevel.geometry('%dx%d+%d+%d' % (size + (x, y)))


        def set_keybindings(self):
            self.bind_all('<Control-o>', lambda event: self.open_file())
            self.bind_all('<Control-s>', lambda event: self.save_file())
            self.bind_all('<Control-q>', self.quit_app)
            self.bind_all('<Control-h>', lambda event: self.show_help())
            self.bind_all('<Return>', lambda event: self.on_ok_clicked())


        def on_ok_clicked(self):
            print ('Entry text: %s' % self.entry.get())
            print ('Scale value: %.1f' % self.scale.get())
            print ('Checkbutton value: %i' % self.checkbox_val.get())
            print ('Spinbox value: %i' % int(self.spinbox.get()))
            print ('OptionMenu value: %s' % self.enum_val.get()) 


        def create_menu(self):
            menubar = tk.Menu(self)

            fileMenu = tk.Menu(menubar, tearoff=False)
            menubar.add_cascade(label="File", underline=0, menu=fileMenu)
            fileMenu.add_command(label="Open", underline=1, command=self.open_file, accelerator="Ctrl+O")
            fileMenu.add_command(label="Save", underline=1, command=self.save_file, accelerator="Ctrl+S")
            fileMenu.add_command(label="Quit", underline=1, command=self.quit_app, accelerator="Ctrl+Q")

            helpMenu = tk.Menu(menubar, tearoff=False)
            menubar.add_cascade(label="Help", underline=0, menu=helpMenu)
            helpMenu.add_command(label="Help", underline=1, command=self.show_help, accelerator="Ctrl+H")
            helpMenu.add_command(label="About", underline=1, command=self.about_app)
            self.config(menu=menubar)


        def open_file(self):
            """Options are explained here: http://tkinter.unpythonic.net/wiki/tkFileDialog"""
            filename = askopenfilename(title='Open a file')
            if filename:
                print ('Open and do something with %s' % filename)


        def save_file(self):
            """Options are explained here: http://tkinter.unpythonic.net/wiki/tkFileDialog"""
            filename = asksaveasfilename()
            if filename:
                print ('Save something to %s' % filename)


        def quit_app(self):
            app.destroy()


        def show_help(self):
            # FIXME: pressing return correctly closes dialog, but also incorrectly fires the main window's 'on_click' method
            about_text = """
            Contact: \n
            example@hotmail.com"""
            about_dialog = tk.Toplevel(self)
            about_dialog.title('About App')
            about_dialog.bind('<Escape>', lambda event: about_dialog.destroy())
            about_dialog.bind('<Return>', lambda event: about_dialog.destroy())
            App.center_on_screen(about_dialog)
            tk.Message(about_dialog, text=about_text).pack()
            button = tk.Button(about_dialog, text='Close', command=about_dialog.destroy).pack()


        def about_app(self):
            # FIXME: pressing return correctly closes dialog, but also incorrectly fires the main window's 'on_click' method
            about_text = """
            This application is made by Jan Jansen\n
            version 0.7"""
            about_dialog = tk.Toplevel(self)
            about_dialog.title('About App')
            about_dialog.bind('<Escape>', lambda event: about_dialog.destroy())
            about_dialog.bind('<Return>', lambda event: about_dialog.destroy())
            App.center_on_screen(about_dialog)
            tk.Message(about_dialog, text=about_text).pack()
            button = tk.Button(about_dialog, text='Close', command=about_dialog.destroy).pack()

        def tabes(self):
            nb = ttk.Notebook()
            nb.pack(expand=1, fill="both")


                    # Frame to hold contentx
            frame = tk.Frame(nb)

            vscroll = tk.Scrollbar(frame, orient="vertical")
            #panel['yscroll'] = vscroll.set
            vscroll.pack(side="right", fill="y")

            for facilityname in Facilities:
                panel = FacilityPanel(frame, facilityname, capfacility[facilityname], safetystock[facilityname], maxpressure[facilityname], str(compulsorystarttime[facilityname]),  str(compulsoryendtime[facilityname]), demandmatrix[facilityname][1], demandmatrix[facilityname][2], demandmatrix[facilityname][3], demandmatrix[facilityname][4], demandmatrix[facilityname][5], demandmatrix[facilityname][6], demandmatrix[facilityname][7])
                panel.pack(fill="both")


            # add to notebook (underline = index for short-cut character)
            nb.add(frame, text='Facilities', underline=0, padding=2)


    #--------------------------------------------------------------------------------------------------------
        def getdata(self):
                wb = openpyxl.load_workbook("data.xlsx")


                ws = wb["Facilities"]
                global Facilities
                Facilities = ([])
                row_count = ws.max_row
                column_count = ws.max_column
                global initlevel
                initlevel = defaultdict(dict)
                global capfacility
                capfacility = defaultdict(dict)
                global safetystock
                safetystock = defaultdict(dict)
                global maxpressure
                maxpressure = defaultdict(dict)
                global pressureincrease
                pressureincrease = defaultdict(dict)
                global compulsorystarttime
                compulsorystarttime = defaultdict(dict)
                global compulsoryendtime
                compulsoryendtime = defaultdict(dict)
                global demandmatrix
                demandmatrix = defaultdict(dict)
                for i in range(3, row_count+1, 1):
                      Facilities.append(ws.cell(row = i, column = 1).value)
                      initlevel[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 2).value
                      capfacility[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 3).value
                      safetystock[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 4).value
                      maxpressure[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 5).value
                      pressureincrease[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 6).value
                      compulsorystarttime[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 7).value
                      compulsoryendtime[ws.cell(row = i, column = 1).value]  = ws.cell(row = i, column = 8).value
                      for j in range (9, column_count+1, 1):
                         demandmatrix[ws.cell(row = i, column = 1).value][ws.cell(row = 2, column = j).value] = ws.cell(row = i, column = j).value


    if __name__ == "__main__":
        app = App()
        app.title("Planning")
        toplevel = app.winfo_toplevel()
        toplevel.wm_state('zoomed')
        app.mainloop()
    class FacilityPanel(Frame):
        def __init__(self, app, facility_name, capacity, safetystock, maxpressure, compulsorystarttime, compulsoryendtime, demandma, demanddi, demandwo, demanddo, demandvr, demandza, demandzo):
            Frame.__init__(self, app)

            group = LabelFrame(self, text=facility_name)
            group.pack(side =LEFT)

            group.enable_facility = IntVar()
            enable_button = Checkbutton(group, variable = group.enable_facility,
                command = print("toggle"))
            enable_button.pack(side = LEFT)
            enable_button.select()

            group.init_level = IntVar()
            init_label = Label(group, text="Current Level: 5,06 m\u00B3")
            init_label.pack(side = LEFT)

            group.capacity = DoubleVar()
            capacity_label = Label(group, text="Capacity:")
            capacity_label.pack(side = LEFT)
            capacity_entry = Entry(group, width=8)
            capacity_entry.pack(side = LEFT)
            capacity_entry.insert(0, capacity)
            capacity_label_unit = Label(group, text="kg ")
            capacity_label_unit.pack(side = LEFT)

            group.safetystock = DoubleVar()
            safetystock_label = Label(group, text="Safetystock:")
            safetystock_label.pack(side = LEFT)
            safetystock_entry = Entry(group, width=8)
            safetystock_entry.pack(side = LEFT)
            safetystock_entry.insert(0, safetystock)
            safetystock_label_unit = Label(group, text="kg ")
            safetystock_label_unit.pack(side = LEFT)

            group.maxpressure = DoubleVar()
            maxpressure_label = Label(group, text="Maxpressure:")
            maxpressure_label.pack(side = LEFT)
            maxpressure_entry = Entry(group, width=8)
            maxpressure_entry.pack(side = LEFT)
            maxpressure_entry.insert(0, maxpressure)
            maxpressure_label_unit = Label(group, text="bar ")
            maxpressure_label_unit.pack(side = LEFT)

            group.comp_start_time = DoubleVar()
            comp_time1_label = Label(group, text="Unload time window:")
            comp_time1_label.pack(side = LEFT)
            comp_start_time_entry = Entry(group, width=8)
            comp_start_time_entry.pack(side = LEFT)
            comp_start_time_entry.insert(0, compulsorystarttime)
            comp_time2_label = Label(group, text="-")
            comp_time2_label.pack(side = LEFT)
            comp_end_time_entry = Entry(group, width=8)
            comp_end_time_entry.pack(side = LEFT)
            comp_end_time_entry.insert(0, compulsoryendtime)
            comp_time3_label = Label(group, text="hours           ")
            comp_time3_label.pack(side = LEFT)

            group.demandmaandag = DoubleVar()
            demandmaandag_label = Label(group, text="Maandag:")
            demandmaandag_label.pack(side = LEFT)
            demandmaandag_entry = Entry(group, width=8)
            demandmaandag_entry.pack(side = LEFT)
            demandmaandag_entry.insert(0, demandma)
            demandmaandag_label_unit = Label(group, text="kg ")
            demandmaandag_label_unit.pack(side = LEFT)

            group.demanddinsdag = DoubleVar()
            demanddinsdag_label = Label(group, text="Dinsdag:")
            demanddinsdag_label.pack(side = LEFT)
            demanddinsdag_entry = Entry(group, width=8)
            demanddinsdag_entry.pack(side = LEFT)
            demanddinsdag_entry.insert(0, demanddi)
            demanddinsdag_label_unit = Label(group, text="kg ")
            demanddinsdag_label_unit.pack(side = LEFT)

            group.demandwoensdag = DoubleVar()
            demandwoensdag_label = Label(group, text="Woensdag:")
            demandwoensdag_label.pack(side = LEFT)
            demandwoensdag_entry = Entry(group, width=8)
            demandwoensdag_entry.pack(side = LEFT)
            demandwoensdag_entry.insert(0, demandwo)
            demandwoensdag_label_unit = Label(group, text="kg ")
            demandwoensdag_label_unit.pack(side = LEFT)

            group.demanddonderdag = DoubleVar()
            demanddonderdag_label = Label(group, text="Donderdag:")
            demanddonderdag_label.pack(side = LEFT)
            demanddonderdag_entry = Entry(group, width=8)
            demanddonderdag_entry.pack(side = LEFT)
            demanddonderdag_entry.insert(0, demanddo)
            demanddonderdag_label_unit = Label(group, text="kg ")
            demanddonderdag_label_unit.pack(side = LEFT)

            group.demandvrijdag = DoubleVar()
            demandvrijdag_label = Label(group, text="Vrijdag:")
            demandvrijdag_label.pack(side = LEFT)
            demandvrijdag_entry = Entry(group, width=8)
            demandvrijdag_entry.pack(side = LEFT)
            demandvrijdag_entry.insert(0, demandvr)
            demandvrijdag_label_unit = Label(group, text="kg ")
            demandvrijdag_label_unit.pack(side = LEFT)

            group.demandzaterdag = DoubleVar()
            demandzaterdag_label = Label(group, text="Zaterdag:")
            demandzaterdag_label.pack(side = LEFT)
            demandzaterdag_entry = Entry(group, width=8)
            demandzaterdag_entry.pack(side = LEFT)
            demandzaterdag_entry.insert(0, demandza)
            demandzaterdag_label_unit = Label(group, text="kg ")
            demandzaterdag_label_unit.pack(side = LEFT)

            group.demandzaterdag = DoubleVar()
            demandzondag_label = Label(group, text="Zondag:")
            demandzondag_label.pack(side = LEFT)
            demandzondag_entry = Entry(group, width=8)
            demandzondag_entry.pack(side = LEFT)
            demandzondag_entry.insert(0, demandzo)
            demandzondag_label_unit = Label(group, text="kg ")
            demandzondag_label_unit.pack(side = LEFT)