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