Python GUI 023 – button_utils.py

The button_utils.py module currently contains the following functions. As of right now, YesNoBox() and YesNoCancelBox() are just for reference and are not used anywhere in any of the solver projects.

YesNoBox()
YesNoCancelBox()


(DisplaySettingsBox example)

DisplaySettingsBox()
Used for toggling the flags for showing CONs: to be processed, that are Done, and that are to be Skipped.


(HillclimbSettingsBox example)

HillclimbSettingsBox()
Used for changing the hillclimbing settings for solving CONs using the hillclimbing approach. Right now, it’s optimized for cryptarithms. That may have to be changed for every other cryptogram type.


(GotoRecordBox example)

GotoRecordBox()
Allows the user to jump to a desired CON record. Only one record selectable at a time. Could easily be modified for other tasks.


(WordListBox example – still in development)

WordListBox()
This is more of a general item selection listbox, which allows for multiple selections. It’s tailored for updating wordlists, but could easily be modified for other tasks. Includes “Add” and “Delete” buttons right now.

import tkinter as tk
from tkinter import simpledialog, ttk
from tkinter.messagebox import showerror

class YesNoBox(simpledialog.Dialog):
... def __init__(self, master, *args, **kwargs):
....... self.sample_var = tk.StringVar()
....... self.sample_var.set("No")

....... self.label_var = tk.StringVar()
....... self.label_var.set(kwargs.pop("msg", "default msg"))

....... simpledialog.Dialog.__init__(
........... self, master, title=kwargs.pop("wtitle", "default title"),

........... *args, **kwargs
....... )

... def body(self, master):
....... ttk.Label(master, textvariable=self.label_var).grid(row=0,

................. columnspan=3)

....... self.btn_yes = ttk.Button(
........... master, text="Yes", command=lambda:

........... self._button_pressed(master, 'Yes')
....... ).grid(row=1, column=0)

....... self.btn_no = ttk.Button(
........... master, text="No", command=lambda:

........... self._button_pressed(master, 'No')
....... ).grid(row=1, column=2)

... def _button_pressed(self, master, value):
....... self.sample_var.set(value)
....... self.ok()

... def validate(self):
....... return 1 # override

... def apply(self):
....... self.result = self.sample_var.get()

... def buttonbox(self):
....... pass

class YesNoCancelBox(simpledialog.Dialog):
... def __init__(self, master, *args, **kwargs):
....... self.sample_var = tk.StringVar()
....... self.sample_var.set("No")

....... self.label_var = tk.StringVar()
....... self.label_var.set(kwargs.pop("msg", "default msg"))

....... simpledialog.Dialog.__init__(
........... self, master, title=kwargs.pop("wtitle", "default title"),

........... *args, **kwargs
....... )

... def body(self, master):
....... ttk.Label(master,

........... textvariable=self.label_var).grid(row=0, columnspan=3)

....... self.btn_yes = ttk.Button(
........... master, text="Yes",

........... command=lambda: self._button_pressed(master, 'Yes')
....... ).grid(row=1, column=0)

....... self.btn_no = ttk.Button(
........... master, text="No",

........... command=lambda: self._button_pressed(master, 'No')
....... ).grid(row=1, column=1)

....... self.btn_cancel = ttk.Button(
........... master, text="Cancel",

........... command=lambda: self._button_pressed(master, 'Cancel')
....... ).grid(row=1, column=2)

... def _button_pressed(self, master, value):
....... self.sample_var.set(value)
....... self.ok()

... def validate(self):
....... return 1 # override

... def apply(self):
....... self.result = self.sample_var.get()

... def buttonbox(self):
....... pass

class DisplaySettingsBox(simpledialog.Dialog):
... def __init__(self, master, *args, **kwargs):

....... dispset = kwargs.pop("dispset")

....... self.process_var = tk.IntVar()
....... self.done_var = tk.IntVar()
....... self.skip_var = tk.IntVar()
....... self.process_var.set(dispset[0])
....... self.done_var.set(dispset[1])
....... self.skip_var.set(dispset[2])

....... self.label_var = tk.StringVar()
....... self.label_var.set(kwargs.pop("msg", "default msg"))

....... simpledialog.Dialog.__init__(
........... self, master, title=kwargs.pop("wtitle", "default title"),

........... *args, **kwargs
....... )

... def body(self, master):
....... ttk.Label(master,

................. textvariable=self.label_var).grid(row=0,
................. columnspan=3)

....... self.process_btn = ttk.Checkbutton(master, text="To process",
.......................... variable=self.process_var)
....... self.process_btn.grid(row=1, column=0)

....... self.done_btn = ttk.Checkbutton(master, text="Is Done",
....................................... variable=self.done_var)
....... self.done_btn.grid(row=1, column=1)

....... self.skip_btn = ttk.Checkbutton(master, text="Is Skip",
....................................... variable=self.skip_var)
....... self.skip_btn.grid(row=1, column=2)

....... self.btn_apply = ttk.Button(
........... master, text="Apply",

........... command=lambda: self._button_apply(master)
....... ).grid(row=2, columnspan=3)

... def _button_apply(self, master):
....... self.ok()

... def validate(self):
....... if int(self.process_var.get()) == 0 and

........... int(self.done_var.get()) == 0 and
........... int(self.skip_var.get()) == 0:
............... showerror(title='Error',
message=
...................'No boxes checked.\nPlease check at least one.')
........... return 0

....... return 1 # override

... def apply(self):
....... ret_var = [self.process_var.get(), self.done_var.get(),

.................. self.skip_var.get()]
....... self.result = ret_var

... def buttonbox(self):
....... pass

class HillclimbSettingsBox(simpledialog.Dialog):
... def __init__(self, master, *args, **kwargs):

....... climbset = kwargs.pop("climbset")

....... self.base_var = tk.IntVar()
....... self.loop_var = tk.IntVar()
....... self.hill_var = tk.IntVar()
....... self.base_var.set(climbset[0])
....... self.loop_var.set(climbset[1])
....... self.hill_var.set(climbset[2])

....... self.label_var = tk.StringVar()
....... self.label_var.set(kwargs.pop("msg", "default msg"))

....... simpledialog.Dialog.__init__(
........... self, master, title=kwargs.pop("wtitle", "default title"),

.......................................... *args, **kwargs
....... )

... def body(self, master):

....... ttk.Label(master,
................. textvariable=self.label_var)
................. .grid(row=0, columnspan=2)

....... ttk.Label(master, text='Min. Base:')
.......... .grid(column=0, row=1, sticky=tk.E, padx=5, pady=5)
....... ttk.Label(master, text='Loop Count:')

.......... .grid(column=0, row=2, sticky=tk.E, padx=5, pady=5)
....... ttk.Label(master, text='Hill Count:')

.......... .grid(column=0, row=3, sticky=tk.E, padx=5, pady=5)

....... self.base_entry = ttk.Entry(master,
........... width=10, textvariable=self.base_var)
.......... .grid(column = 1, row = 1, sticky=tk.W, padx=5, pady=5)

....... self.loop_entry = ttk.Entry(master,
................................... width=10,
................................... textvariable=self.loop_var)
........... .grid(column = 1, row = 2, sticky=tk.W, padx=5, pady=5)

....... self.hill_entry = ttk.Entry(master,
................................... width=10,
................................... textvariable=self.hill_var)
........... .grid(column = 1, row = 3, sticky=tk.W, padx=5, pady=5)

........ self.btn_apply = ttk.Button(master, text="Apply",
.................................... command=lambda:
.................................... self._button_apply(master))
............ .grid(row=4, columnspan=2)

... def _button_apply(self, master):
....... self.ok()

... def validate(self):
....... return 1 # override

... def apply(self):
....... ret_var = [self.base_var.get(), self.loop_var.get(),

.................. self.hill_var.get()]
....... self.result = ret_var

... def buttonbox(self):
....... pass

class GotoRecordBox(simpledialog.Dialog):
... def __init__(self, master, *args, **kwargs):

....... self.recordset = kwargs.pop("recordset")

....... simpledialog.Dialog.__init__(
........... self, master, title=kwargs.pop("wtitle", "default title"),

........... *args, **kwargs
....... )

... def body(self, master):

....... self.listbox = tk.Listbox(master, height=30,
................................. selectmode=tk.SINGLE)
....... self.listbox.pack(expand=True, padx= 20,

......................... fill=tk.X, side = tk.LEFT)
....... self.listbox.bind('<>', self._items_selected)

....... self.scrollbar = ttk.Scrollbar(master, orient = tk.VERTICAL)
....... self.scrollbar.pack(side = tk.RIGHT, fill = tk.BOTH)

....... for rec in self.recordset:
........... self.listbox.insert(tk.END, rec)

....... self.listbox['yscrollcommand'] = self.scrollbar.set
....... self.scrollbar['command'] = self.listbox.yview

... def _items_selected(self, master):
....... self.ok()

... def validate(self):
....... return 1 # override

... def apply(self):
....... ret = []
....... for r in self.listbox.curselection():
........... ret.append(r)
....... self.result = ret

... def buttonbox(self):
....... pass

class WordListBox(simpledialog.Dialog):
... def __init__(self, master, *args, **kwargs):

....... self.recordset = kwargs.pop("recordset")
....... self.lheight = kwargs.pop("lheight")
....... self.lwidth = kwargs.pop("lwidth")

....... self.btn_var = tk.IntVar()
....... self.btn_var.set(-1)

....... simpledialog.Dialog.__init__(
........... self, master, title=kwargs.pop("wtitle", "default title"),

........... *args, **kwargs
....... )

... def body(self, master):

....... self.listbox = tk.Listbox(master, height=self.lheight,
................................. width=self.lwidth,
................................. selectmode=tk.MULTIPLE)
....... self.listbox.grid(row=0, columnspan=3)

....... self.scrollbar = ttk.Scrollbar(master, orient = tk.VERTICAL)
....... self.scrollbar.grid(row=0, column=3, sticky=tk.NS)

....... for rec in self.recordset:
........... self.listbox.insert(tk.END, rec)

....... self.listbox['yscrollcommand'] = self.scrollbar.set
....... self.scrollbar['command'] = self.listbox.yview

....... self.btn_add = ttk.Button(
........... master, text="Add", command=lambda:

........... self._button_process(master, 0)
....... ).grid(row=1, column=0, padx=10, pady=10)

....... self.btn_delete = ttk.Button(
........... master, text="Delete", command=lambda:

........... self._button_process(master, 1)
....... ).grid(row=1, column=2, padx=10, pady=10)

... def _button_process(self, master, val):
....... self.btn_var.set(val)
....... self.ok()

... def validate(self):
....... return 1 # override

... def apply(self):
....... ret = []
....... for r in self.listbox.curselection():
.......... ret.append(r)
....... self.result = (self.btn_var.get(), ret)

... def buttonbox(self):
....... pass

Next up: I don’t know.

Published by The Chief

Who wants to know?

Leave a comment

Design a site like this with WordPress.com
Get started