2016-07-07 8 views
0

Ich fange gerade an, in Python zu programmieren, und ich verwende es, um ein kleines Programm mit einer GUI (mit tkinter), die Daten aus nehmen kann eine Excel-Datei (mit openpyxl). Lassen Sie den Benutzer bei Bedarf Dinge ändern und verwenden Sie dann eine Schaltfläche, um die Daten aus den Einträgen in eine Datendatei (.dat) zu schreiben (vorzugsweise durch Aktualisieren der Werte in den defaultdict-Arrays und dann in die .dat-Datei) und eine Modellierungssprache zu verwenden (pyomo), um ein Modell mit den bereitgestellten Daten zu erstellen und es mit dem cbc-Solver zu lösen.Python> tkinter: Wie bekomme ich Werte von einem Panel in einem Notebook-Rahmen

Ich bin jetzt sofar, dass ich das Modell, die grafische Schnittstelle (die mit Daten aus der Excel-Datei gefüllt ist) gemacht habe. Allerdings kann ich die Daten in den Eingabefeldern nicht zurückholen (um die defaultdict Arrays zu schreiben). Ich verstehe die einfachen Beispiele auf stackoverflow (mit entry.get()), aber es hat bei meinem Beispiel nicht funktioniert (wahrscheinlich, weil ich Tabs, Panels und Frames von notbook verwende oder etwas vermasselt habe).

Ich benutze Notebook Tabs statt einer Seite, weil ich mehr (etwa 5) andere Kategorien von Daten in dem vollständigen Programm haben werde. Endlich möchte ich das Programm so gestalten, dass es sich an die Eingabe anpassen kann (es weiß also nicht, ob es 3, 8 oder 10 Möglichkeiten geben wird). Ich benutze Python Version 3.5.1. Hier ist der Link zu der Excel-Datei: https://drive.google.com/file/d/0B5vmtJnltudJWW4xakZlYnQ3RTg/view?usp=sharing

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 
      [email protected]""" 
      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() 

Und das ist die Klasse I gemacht: von tkinter import *

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) 
+1

TL; DR. Zu viel Information und Code. Bitte bearbeiten Sie Ihren Beitrag, um die * minimalen * Informationen und den Code zu enthalten, die notwendig sind, um Ihr Problem zu demonstrieren. Openpyxl und pyomo sowie cbc-Solver scheinen für das vorliegende Problem nicht relevant zu sein und müssen daher nicht erwähnt werden. – SiHa

Antwort

Verwandte Themen