example
This commit is contained in:
91
panel.py
Normal file
91
panel.py
Normal file
@ -0,0 +1,91 @@
|
||||
from random import random
|
||||
import wx
|
||||
|
||||
from slic.gui.widgets import LabeledMathEntry
|
||||
from slic.gui.widgets import make_filled_hbox, make_filled_vbox
|
||||
from slic.gui.widgets.plotting import PlotPanel
|
||||
|
||||
|
||||
class MainPanel(wx.Panel):
|
||||
|
||||
def __init__(self, parent):
|
||||
super().__init__(parent)
|
||||
|
||||
self.beans = []
|
||||
self.spilled = []
|
||||
|
||||
btn_minus = wx.Button(self, label="-")
|
||||
btn_plus = wx.Button(self, label="+")
|
||||
btn_check = wx.Button(self, label="?")
|
||||
|
||||
btns = (btn_minus, btn_plus, btn_check)
|
||||
hb_btns = make_filled_hbox(btns)
|
||||
|
||||
self.le_beans = le_beans = LabeledMathEntry(self, label="How many beans?", value=0)
|
||||
self.le_spilled = le_spilled = LabeledMathEntry(self, label="Spilled beans:", value=0)
|
||||
le_spilled.Disable()
|
||||
|
||||
self.plot_beans = plot_beans = PlotPanel(self)
|
||||
self.plot_spilled = plot_spilled = PlotPanel(self)
|
||||
|
||||
plots = (plot_beans, plot_spilled)
|
||||
hb_plots = make_filled_hbox(plots)
|
||||
|
||||
widgets = (hb_btns, le_beans, le_spilled, hb_plots)
|
||||
box = make_filled_vbox(widgets, border=10)
|
||||
self.SetSizerAndFit(box)
|
||||
|
||||
btn_minus.Bind(wx.EVT_BUTTON, self.on_click_minus)
|
||||
btn_plus.Bind(wx.EVT_BUTTON, self.on_click_plus)
|
||||
btn_check.Bind(wx.EVT_BUTTON, self.on_click_check)
|
||||
|
||||
|
||||
|
||||
def on_click_minus(self, _event):
|
||||
le = self.le_beans
|
||||
current = le.GetValue()
|
||||
le.SetValue(current - 1)
|
||||
self.update_plot()
|
||||
|
||||
def on_click_plus(self, _event):
|
||||
if random() < 0.9:
|
||||
le = self.le_beans
|
||||
else:
|
||||
le = self.le_spilled
|
||||
current = le.GetValue() or 0
|
||||
le.SetValue(current + 1)
|
||||
self.update_plot()
|
||||
|
||||
def on_click_check(self, _event):
|
||||
percent = self.get_percentage()
|
||||
msg = f"You spilled {percent:.2}% of the beans."
|
||||
self.le_beans.SetValue(0)
|
||||
self.le_spilled.SetValue(0)
|
||||
wx.MessageBox(msg, "Spillage Stats", wx.OK|wx.ICON_WARNING)
|
||||
|
||||
def get_percentage(self):
|
||||
b = self.le_beans.GetValue() or 0
|
||||
s = self.le_spilled.GetValue() or 0
|
||||
return s / b * 100
|
||||
|
||||
|
||||
def update_plot(self):
|
||||
self.store_values()
|
||||
self.draw_plot()
|
||||
|
||||
def store_values(self):
|
||||
b = self.le_beans.GetValue() or 0
|
||||
s = self.le_spilled.GetValue() or 0
|
||||
self.beans.append(b)
|
||||
self.spilled.append(s)
|
||||
|
||||
def draw_plot(self):
|
||||
self.plot_beans.clear()
|
||||
self.plot_spilled.clear()
|
||||
self.plot_beans.plot(self.beans)
|
||||
self.plot_spilled.plot(self.spilled)
|
||||
self.plot_beans.draw()
|
||||
self.plot_spilled.draw()
|
||||
|
||||
|
||||
|
55
start.py
Executable file
55
start.py
Executable file
@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import wx
|
||||
|
||||
from slic.gui.persist import Persistence
|
||||
|
||||
from panel import MainPanel
|
||||
|
||||
|
||||
def run(*args, **kwargs):
|
||||
app = wx.App()
|
||||
frame = MainFrame(*args, **kwargs)
|
||||
frame.Show()
|
||||
app.MainLoop()
|
||||
app.Yield() #TODO: without this, wxPython segfaults locking a mutex
|
||||
|
||||
|
||||
def get_wx_icon(fname="icon.png"):
|
||||
iname = os.path.dirname(__file__)
|
||||
iname = os.path.join(iname, fname)
|
||||
return wx.Icon(iname)
|
||||
|
||||
|
||||
|
||||
class MainFrame(wx.Frame):
|
||||
|
||||
def __init__(self, title="Coffee 365"):
|
||||
super().__init__(None, title=title)
|
||||
self.SetIcon(get_wx_icon())
|
||||
|
||||
main = MainPanel(self)
|
||||
|
||||
# make sure the window is large enough
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
sizer.Add(main, proportion=1, flag=wx.EXPAND)
|
||||
self.SetSizerAndFit(sizer)
|
||||
|
||||
self.persist = persist = Persistence(".coffee365", self)
|
||||
persist.load()
|
||||
|
||||
self.Bind(wx.EVT_CLOSE, self.on_close)
|
||||
|
||||
|
||||
def on_close(self, event):
|
||||
self.persist.save()
|
||||
event.Skip() # forward the close event
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user