mirror of
https://github.com/Xevion/tkinter-mini-projects.git
synced 2025-12-05 23:16:36 -06:00
init
This commit is contained in:
184
ComplexTreeView.py
Normal file
184
ComplexTreeView.py
Normal file
@@ -0,0 +1,184 @@
|
||||
# Reference: http://pythonbeginners.com/python-beginner-tutorial/python-tkinter/tkinter-frames
|
||||
# Reference: https://stackoverflow.com/questions/34276663/tkinter-gui-layout-using-frames-and-grid
|
||||
# grid reference: https://stackoverflow.com/questions/34276663/tkinter-gui-layout-using-frames-and-grid
|
||||
|
||||
import os
|
||||
from tkinter import *
|
||||
from tkinter import ttk
|
||||
from tkinter.ttk import *
|
||||
|
||||
import _thread
|
||||
import pandas as pd
|
||||
import time
|
||||
|
||||
|
||||
class TableViewer():
|
||||
def __init__(self, master, newTitle):
|
||||
self.newWindow = Toplevel(master)
|
||||
self.newWindow.title(newTitle)
|
||||
|
||||
# declare frames
|
||||
self.leftframe = ttk.Frame(self.newWindow, width=100, height=300, pad=10)
|
||||
self.rightframe = ttk.Frame(self.newWindow, width=200, height=300, pad=10)
|
||||
self.bottomframe = ttk.Frame(self.newWindow, width=300, height=50, pad=5)
|
||||
|
||||
# arrange frames
|
||||
self.arrangeBottomFrame()
|
||||
self.arrangeLeftFrameUI()
|
||||
self.arrangeRightFrameUI()
|
||||
|
||||
# place your widgets(2 frames) into windows
|
||||
self.leftframe.grid(row=1, column=1)
|
||||
self.rightframe.grid(row=1, column=2, sticky=W+E+N+S) # sticky="WE" means the inside-objects can extend to west and east
|
||||
self.rightframe.grid_rowconfigure(0, weight=1)
|
||||
self.bottomframe.grid(row=2, column=1, sticky="WE", columnspan=2)
|
||||
|
||||
# set a variable of chosen condition
|
||||
self.currentCondition = "ALL"
|
||||
|
||||
def arrangeBottomFrame(self):
|
||||
self.lbl_status = ttk.Label(self.bottomframe, text="Count = ")
|
||||
self.lbl_status.pack(side=LEFT)
|
||||
|
||||
def arrangeRightFrameUI(self):
|
||||
# configure grid 7*3
|
||||
self.rightframe.grid_rowconfigure(0, weight=1)
|
||||
self.rightframe.grid_rowconfigure(6, weight=1)
|
||||
self.rightframe.grid_columnconfigure(0, weight=1)
|
||||
self.rightframe.grid_columnconfigure(2, weight=1)
|
||||
|
||||
|
||||
L1 = Label(self.rightframe, text="Display greater than ")
|
||||
self.ety_Greater = Entry(self.rightframe, width=5)
|
||||
btn_filter_Greater = ttk.Button(self.rightframe, text="Filter Greater", command=self.filter_greater, width=10)
|
||||
|
||||
L2 = Label(self.rightframe, text="Display less than ")
|
||||
self.ety_Less = Entry(self.rightframe, width=5)
|
||||
btn_filter_Less = ttk.Button(self.rightframe, text="Filter Less", command=self.filter_less, width=10)
|
||||
|
||||
btn_showAll = ttk.Button(self.rightframe, text="Show All Data", command=self.showAllData, width=20)
|
||||
|
||||
# arrange each objects, and put objects on 3rd, 4th, 5th row-grid
|
||||
L1.grid(row=3, column=0)
|
||||
self.ety_Greater.grid(row=3, column=1)
|
||||
btn_filter_Greater.grid(row=3, column=2)
|
||||
|
||||
L2.grid(row=4, column=0, sticky=W)
|
||||
self.ety_Less.grid(row=4, column=1)
|
||||
btn_filter_Less.grid(row=4, column=2)
|
||||
|
||||
btn_showAll.grid(row=5, columnspan=3)
|
||||
|
||||
|
||||
def arrangeLeftFrameUI(self):
|
||||
# create a TreeView
|
||||
self.tree = ttk.Treeview(self.leftframe)
|
||||
self.tree["columns"] = ("Index", "Value")
|
||||
self.tree.column("Index", stretch=True, width=150)
|
||||
self.tree.column("Value", stretch=True, width=100)
|
||||
self.tree.heading("Index", text="Index")
|
||||
self.tree.heading("Value", text="Value")
|
||||
|
||||
# attach a scrollbar to the frame
|
||||
treeScroll = ttk.Scrollbar(self.leftframe)
|
||||
treeScroll.configure(command=self.tree.yview)
|
||||
self.tree.configure(yscrollcommand=treeScroll.set)
|
||||
|
||||
# read data from file
|
||||
dataFileDir = "/Users/alumi/PycharmProjects/StocksInfoRetrieval/Data/data_mm.pkl"
|
||||
if os.path.exists(dataFileDir):
|
||||
self.tableData = pd.read_pickle(dataFileDir)
|
||||
self.showAllData()
|
||||
|
||||
# put tree and scroll beside each other in the left frame
|
||||
self.tree.pack(side=LEFT)
|
||||
treeScroll.pack(side=LEFT, fill=Y)
|
||||
|
||||
def insertItem2TreeView(self, itemText, values):
|
||||
### insert format -> insert(parent, index, iid=None, **kw)
|
||||
### reference: https://docs.python.org/3/library/tkinter.ttk.html#tkinter.ttk.Treeview
|
||||
myItemID = self.tree.insert("", "end", text=itemText, values=(values[0], values[1]))
|
||||
|
||||
if myItemID == None:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def showAllData(self):
|
||||
# first clear all
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
for i in range(0, self.tableData['HIGH'].size):
|
||||
self.insertItem2TreeView("HIGH", [self.tableData['HIGH'].index[i], self.tableData['HIGH'].values[i]])
|
||||
|
||||
self.updateStatusBar()
|
||||
# print("Tree View Count = " + str(len(self.tree.get_children())))
|
||||
|
||||
def filter_greater(self):
|
||||
self.currentCondition = "GREATER"
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
comparedValue = float(self.ety_Greater.get())
|
||||
for i in range(0, self.tableData['HIGH'].size):
|
||||
if (self.tableData['HIGH'].values[i] > comparedValue):
|
||||
self.insertItem2TreeView("HIGH", [self.tableData['HIGH'].index[i], self.tableData['HIGH'].values[i]])
|
||||
|
||||
self.updateStatusBar()
|
||||
# print("Tree View Count = " + str(len(self.tree.get_children())))
|
||||
|
||||
def filter_less(self):
|
||||
self.currentCondition = "LESS"
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
comparedValue = float(self.ety_Less.get())
|
||||
for i in range(0, self.tableData['HIGH'].size):
|
||||
if (self.tableData['HIGH'].values[i] < comparedValue):
|
||||
self.insertItem2TreeView("HIGH", [self.tableData['HIGH'].index[i], self.tableData['HIGH'].values[i]])
|
||||
|
||||
self.updateStatusBar()
|
||||
# print("Tree View Count = " + str(len(self.tree.get_children())))
|
||||
|
||||
def updateTable(self):
|
||||
print("Current Condition is " + self.currentCondition)
|
||||
if self.currentCondition == "ALL":
|
||||
self.showAllData()
|
||||
elif self.currentCondition == "GREATER":
|
||||
self.filter_greater()
|
||||
elif self.currentCondition == "LESS":
|
||||
self.filter_less()
|
||||
else:
|
||||
print("Current Condition has wrong value!!")
|
||||
|
||||
def updateStatusBar(self):
|
||||
self.lbl_status.config(text="Tree View Count = " + str(len(self.tree.get_children())))
|
||||
# print("Tree View Count = " + str(len(self.tree.get_children())))
|
||||
|
||||
|
||||
# test for dynamic update
|
||||
def addNewData2TableData(self, timestamp):
|
||||
# print(self.tableData)
|
||||
newitem = self.tableData.loc["2330 TT Equity"]
|
||||
newitem.loc["HIGH"] = 10.123 + timestamp
|
||||
self.tableData.loc["AlumiInsert"+str(timestamp)] = newitem
|
||||
self.updateTable()
|
||||
# print(newitem)
|
||||
|
||||
|
||||
|
||||
######### The following is for testing!!!
|
||||
def insert_loop(myGUI):
|
||||
i=0
|
||||
while(1):
|
||||
# myGUI.insertItem2TreeView("Alumi", ["Test", 10])
|
||||
myGUI.addNewData2TableData(i)
|
||||
# myGUI.showAllData()
|
||||
i += 1
|
||||
time.sleep(10)
|
||||
|
||||
if __name__ == '__main__':
|
||||
_rootWindow = Tk()
|
||||
myTableViewer = TableViewer(_rootWindow, "Table View")
|
||||
|
||||
try:
|
||||
_thread.start_new_thread(insert_loop, (myTableViewer, ))
|
||||
except:
|
||||
print("Loop of insert is wrong!!\n")
|
||||
|
||||
_rootWindow.mainloop()
|
||||
5
README.md
Normal file
5
README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# tkinter-mini-projects
|
||||
|
||||
Simple repository for storing Tkinter (Python 3) scripts.
|
||||
|
||||
The name of the file should correspond somewhat to what the script is testing.
|
||||
1
api_key.dat
Normal file
1
api_key.dat
Normal file
@@ -0,0 +1 @@
|
||||
78056529fa50d02bb671fce91d4359a1
|
||||
28
buttons.py
Normal file
28
buttons.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from tkinter import *
|
||||
from functools import partial
|
||||
|
||||
def add_buttons():
|
||||
# Add buttons
|
||||
for i in range(10):
|
||||
Button(main, text=str(i), command=partial(print, i)).pack()
|
||||
|
||||
# search for "Add Buttons" Button object and change text and function
|
||||
for child in main.winfo_children():
|
||||
if child.cget('text') == 'Add Buttons':
|
||||
child.config(text='Delete all buttons')
|
||||
child.config(command=delete_buttons)
|
||||
|
||||
def delete_buttons():
|
||||
# search for buttons and delete all except the 'Delete' Button
|
||||
for child in main.winfo_children():
|
||||
if child.winfo_class() == 'Button':
|
||||
if child.cget('text') == 'Delete all buttons':
|
||||
# change "Delete" button text and function
|
||||
child.config(text='Add Buttons')
|
||||
child.config(command=add_buttons)
|
||||
else:
|
||||
child.destroy()
|
||||
|
||||
main = Tk()
|
||||
Button(main,text='Add Buttons', command=add_buttons).pack()
|
||||
main.mainloop()
|
||||
16
dynamic.py
Normal file
16
dynamic.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from tkinter import *
|
||||
from functools import partial
|
||||
import string
|
||||
|
||||
buttons = list(string.printable)
|
||||
print(buttons)
|
||||
root = Tk()
|
||||
|
||||
def txt(text):
|
||||
print(text)
|
||||
|
||||
for b in buttons:
|
||||
btn = Button(root, text=b, command=partial(txt, b))
|
||||
btn.pack(side=LEFT,pady=5)
|
||||
|
||||
root.mainloop()
|
||||
12
excel.py
Normal file
12
excel.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from tkinter import *
|
||||
|
||||
root = Tk()
|
||||
|
||||
height = 5
|
||||
width = 5
|
||||
for i in range(height): #Rows
|
||||
for j in range(width): #Columns
|
||||
b = Entry(root, text="")
|
||||
b.grid(row=i, column=j)
|
||||
|
||||
mainloop()
|
||||
47
fetch_http.py
Normal file
47
fetch_http.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import json, os, sys
|
||||
from tkinter import *
|
||||
import requests as r
|
||||
from functools import partial
|
||||
|
||||
api_url = 'http://api.openweathermap.org/data/2.5/weather?zip={},{}&appid={}'
|
||||
file = open(os.path.join(sys.path[0], 'api_key.dat'), 'r')
|
||||
key = file.read()
|
||||
|
||||
def fetch(zc, cc, api):
|
||||
url = api_url.format(zc, cc, key)
|
||||
response = r.get(url)
|
||||
content = response.json()
|
||||
return content
|
||||
|
||||
class App:
|
||||
def __init__(self, master):
|
||||
self.frame1 = Frame(master)
|
||||
self.frame2 = Frame(master)
|
||||
|
||||
self.outputvar = StringVar()
|
||||
self.zipvar = StringVar()
|
||||
|
||||
self.zipentry = Entry(self.frame1, textvariable=self.zipvar)
|
||||
|
||||
self.fetchbtn = Button(self.frame1, text="Fetch!", command=lambda:self.fetch(self.zipvar.get()))
|
||||
self.output = Label(self.frame2, textvariable=self.outputvar, wraplength=300)
|
||||
|
||||
self.frame1.pack()
|
||||
self.frame2.pack()
|
||||
|
||||
self.zipentry.pack(padx=5,pady=5)
|
||||
self.fetchbtn.pack(padx=5)
|
||||
self.output.pack()
|
||||
|
||||
def fetch(self, zipcode):
|
||||
if zipcode == '': return None
|
||||
content = fetch(zipcode, 'us', key)
|
||||
if str(content['cod'])[0] != '2':
|
||||
print('Unpredicted Status Code Found')
|
||||
print(content)
|
||||
print()
|
||||
return None
|
||||
self.outputvar.set(content['weather'])
|
||||
root = Tk()
|
||||
app = App(root)
|
||||
root.mainloop()
|
||||
38
fibonacci.py
Normal file
38
fibonacci.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from tkinter import *
|
||||
|
||||
x = 1
|
||||
y = 1
|
||||
z = 0
|
||||
|
||||
class App:
|
||||
def __init__(self, master):
|
||||
frame = Frame(master)
|
||||
frame.pack()
|
||||
|
||||
self.textVar = StringVar()
|
||||
|
||||
# Lambda Version
|
||||
# self.button = Button(
|
||||
# frame, textvariable=self.textVar, command=lambda: self.textVar.set(fibonacci())
|
||||
# )
|
||||
# self.button.pack()
|
||||
|
||||
# tkinter Version, using separate functions
|
||||
self.button = Button(
|
||||
frame, textvariable=self.textVar, command=self.update
|
||||
)
|
||||
self.button.pack()
|
||||
|
||||
def update(self):
|
||||
self.textVar.set(str(fibonacci()))
|
||||
|
||||
def fibonacci():
|
||||
global x, y, z
|
||||
z = x
|
||||
x = x + y
|
||||
y = z
|
||||
return x
|
||||
|
||||
root = Tk()
|
||||
app = App(root)
|
||||
root.mainloop()
|
||||
30
focus_sample.py
Normal file
30
focus_sample.py
Normal file
@@ -0,0 +1,30 @@
|
||||
from tkinter import *
|
||||
from tkinter import ttk
|
||||
|
||||
class App:
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
self.tree = ttk.Treeview(self.root) #create tree
|
||||
self.sv = StringVar() #create stringvar for entry widget
|
||||
self.sv.trace("w", self.command) #callback if stringvar is updated
|
||||
self.entry = Entry(self.root, textvariable=self.sv) #create entry
|
||||
self.names = ["Jane", "Janet", "James", "Jamie"] #these are just test inputs for the tree
|
||||
self.ids = [] #creates a list to store the ids of each entry in the tree
|
||||
for i in range(len(self.names)):
|
||||
#creates an entry in the tree for each element of the list
|
||||
#then stores the id of the tree in the self.ids list
|
||||
self.ids.append(self.tree.insert("", "end", text=self.names[i]))
|
||||
self.tree.pack()
|
||||
self.entry.pack()
|
||||
def command(self, *args):
|
||||
self.selections = [] #list of ids of matching tree entries
|
||||
for i in range(len(self.names)):
|
||||
#the below if check checks if the value of the entry matches the first characters of each element
|
||||
#in the names list up to the length of the value of the entry widget
|
||||
if self.entry.get() != "" and self.entry.get() == self.names[i][:len(self.entry.get())]:
|
||||
self.selections.append(self.ids[i]) #if it matches it appends the id to the selections list
|
||||
self.tree.selection_set(self.selections) #we then select every id in the list
|
||||
|
||||
root = Tk()
|
||||
App(root)
|
||||
root.mainloop()
|
||||
105
gradebookFetcher_selectionSet_problem.py
Normal file
105
gradebookFetcher_selectionSet_problem.py
Normal file
@@ -0,0 +1,105 @@
|
||||
import json, random, datetime, os, faker
|
||||
from functools import partial
|
||||
from tkinter import ttk
|
||||
from tkinter import *
|
||||
|
||||
fake = faker.Faker()
|
||||
|
||||
# Basic Structure of what assignment's data looks like
|
||||
class Assignment:
|
||||
def __init__(self):
|
||||
self.dateDue = fake.date()
|
||||
self.dateAssigned = fake.date()
|
||||
self.name = fake.text(max_nb_chars=15)[:-1]
|
||||
self.category = random.choice(['Daily', 'Major', 'Quiz'])
|
||||
self.weight = random.choice([1.0, 1.0, random.randint(1, 7) * 0.5])
|
||||
self.score = random.choice([100, random.randint(90, 100), random.randint(10, 100)])
|
||||
self.totalPoints = 100
|
||||
self.weightedTotalPoints = self.weight * self.totalPoints
|
||||
self.weightedScore = self.weight * self.score
|
||||
self.percentage = int((self.weightedScore / self.weightedTotalPoints) * 100)
|
||||
|
||||
class Class:
|
||||
def __init__(self):
|
||||
self.className = fake.bs()
|
||||
self.assignments = [Assignment() for _ in range(10)]
|
||||
|
||||
class Window(Frame):
|
||||
def __init__(self, parent):
|
||||
Frame.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.init_interface()
|
||||
|
||||
def randomSet(self):
|
||||
self.choices = [item[1] for item in random.choices(self.treeIDs, k=3)]
|
||||
self.class_assignments.selection_set(self.choices)
|
||||
print(self.class_assignments.selection())
|
||||
|
||||
def assignments_init(self):
|
||||
self.class_notebook = ttk.Notebook(self.assignments)
|
||||
self.class_tabs = []
|
||||
self.classes = [Class() for _ in range(3)]
|
||||
|
||||
longestName = max([int(max([6.5 * len(assignment.name) for assignment in individualClass.assignments])) for individualClass in self.classes])
|
||||
|
||||
for classIndex, individualClass in enumerate(self.classes):
|
||||
# Create a new frame binded to the Class Notebook
|
||||
class_frame = Frame(self.class_notebook)
|
||||
|
||||
# All the column's in order
|
||||
columnStrings = ['Date Due', 'Assigned', 'Name', 'Category', 'Weight', 'Score', 'Weighted Score', 'Total Points', 'Weighted Total Points', 'Percentage']
|
||||
columnWidths = [80, 80, longestName, 80, 80, 80, 100, 80, 130, 80]
|
||||
|
||||
# Create a new TreeView (table) object
|
||||
self.class_assignments = ttk.Treeview(class_frame, columns=columnStrings[1:])
|
||||
|
||||
# Create all the Column's for it
|
||||
for index, columnString in enumerate(list(columnStrings)):
|
||||
self.class_assignments.heading('#{}'.format(index), text=columnString)
|
||||
self.class_assignments.column('#{}'.format(index), minwidth=columnWidths[index], width=columnWidths[index])
|
||||
|
||||
self.treeIDs = []
|
||||
# Insert a assignment with all it's values
|
||||
for index, assignment in enumerate(individualClass.assignments):
|
||||
tree_id = self.class_assignments.insert('', 'end', text=assignment.dateDue, values=(assignment.dateAssigned, assignment.name,
|
||||
assignment.category, assignment.weight, assignment.score, assignment.weightedScore, assignment.totalPoints,
|
||||
assignment.weightedTotalPoints, '{}%'.format(assignment.percentage)))
|
||||
self.treeIDs.append((index, tree_id))
|
||||
|
||||
self.find_worst_button = Button(class_frame, text='Button1', command=partial(self.randomSet, classIndex))
|
||||
# self.randomSet()
|
||||
|
||||
for x in range(11):
|
||||
Grid.columnconfigure(class_frame, x, weight=1)
|
||||
for y in range(3):
|
||||
Grid.rowconfigure(class_frame, y, weight=1)
|
||||
|
||||
# Grid the new Finished Table & Buttons
|
||||
self.class_assignments.grid(column=0, row=0, padx=5, pady=5, columnspan=10)
|
||||
self.find_worst_button.grid(column=0, row=1, padx=5, pady=5, sticky=N+S+E+W)
|
||||
|
||||
# Add a new tab, using this class's frame for the data
|
||||
self.class_notebook.add(class_frame, text=individualClass.className)
|
||||
self.class_tabs.append(class_frame)
|
||||
|
||||
self.class_notebook.grid(column=0, row=0)
|
||||
|
||||
def init_interface(self):
|
||||
# Window Configurations
|
||||
self.parent.title("Gradebook Fetcher")
|
||||
self.parent.config(background="lavender")
|
||||
|
||||
# Notebook for displaying tabs
|
||||
self.notebook = ttk.Notebook(self.parent)
|
||||
self.assignments = Frame(self.notebook)
|
||||
self.assignments_init()
|
||||
self.notebook.add(self.assignments, text='Assignments')
|
||||
self.notebook.grid(column=0, row=0, padx=5, pady=5)
|
||||
|
||||
def main():
|
||||
root = Tk()
|
||||
x = Window(root)
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
7
hello.py
Normal file
7
hello.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from tkinter import *
|
||||
root = Tk()
|
||||
|
||||
w = Label(root, text="Hello World!")
|
||||
w.pack()
|
||||
|
||||
root.mainloop()
|
||||
23
helloworld.py
Normal file
23
helloworld.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from tkinter import *
|
||||
|
||||
class App:
|
||||
def __init__(self, master):
|
||||
frame = Frame(master)
|
||||
frame.pack()
|
||||
|
||||
self.button = Button(
|
||||
frame, text="QUIT", fg="red", command=frame.quit
|
||||
)
|
||||
self.button.pack(side=LEFT)
|
||||
|
||||
self.hi_there = Button(frame, text="Hello", command=self.say_hi)
|
||||
self.hi_there.pack(side=LEFT)
|
||||
|
||||
def say_hi(self):
|
||||
print("Hello World!")
|
||||
|
||||
root = Tk()
|
||||
app = App(root)
|
||||
|
||||
root.mainloop()
|
||||
root.destroy()
|
||||
64
input_fibonacci.py
Normal file
64
input_fibonacci.py
Normal file
@@ -0,0 +1,64 @@
|
||||
from tkinter import *
|
||||
import os, sys, ctypes
|
||||
|
||||
class App:
|
||||
def __init__(self, master):
|
||||
frame1 = Frame(master)
|
||||
frame1.master.title("Fibonacci")
|
||||
frame1.pack()
|
||||
frame2 = Frame(master)
|
||||
frame2.pack()
|
||||
|
||||
# Declare textVar for textbox
|
||||
self.textVar = StringVar()
|
||||
self.textVar.set("2")
|
||||
|
||||
# Setting up textbox, plus/minus buttons and a update button
|
||||
self.entry = Entry(frame2)
|
||||
self.entry.insert(0,"1")
|
||||
self.label = Label(frame1, textvariable=self.textVar)
|
||||
self.flabel = Label(frame2, text="nth=")
|
||||
self.ubutton = Button(frame2, text = "Update", command=self.fibonacci)
|
||||
self.pbutton = Button(frame2, text="+", command=self.plus)
|
||||
self.mbutton = Button(frame2, text="-", command=self.minus)
|
||||
|
||||
# Pack everything
|
||||
self.label.pack(side=LEFT, padx=5)
|
||||
self.flabel.pack(side=LEFT, pady=5)
|
||||
self.entry.pack(side=LEFT, pady=5, padx=(0,5))
|
||||
self.ubutton.pack(side=LEFT, pady=5, padx=(5,0))
|
||||
self.pbutton.pack(side=LEFT, pady=5)
|
||||
self.mbutton.pack(side=LEFT, pady=5, padx=(0,5))
|
||||
|
||||
# Adds one to the textbox's integer then updates the Label
|
||||
def plus(self):
|
||||
string = self.entry.get()
|
||||
self.entry.delete(0, END)
|
||||
self.entry.insert(0, str(int(string) + 1))
|
||||
self.fibonacci()
|
||||
|
||||
# Takes away one from the textbox's integer then updates the Label
|
||||
def minus(self):
|
||||
string = self.entry.get()
|
||||
self.entry.delete(0, END)
|
||||
self.entry.insert(0, str(int(string) - 1))
|
||||
self.fibonacci()
|
||||
|
||||
# Sets the text of the Label to nth integer of the Fibonacci sequence
|
||||
# Supports negatives
|
||||
def fibonacci(self):
|
||||
n = self.entry.get()
|
||||
negative = int(n) < 0
|
||||
x = 1;y = 1;z = 0
|
||||
for _ in range(abs(int(n))):
|
||||
z = x
|
||||
x = x + y
|
||||
y = z
|
||||
if negative: x *= -1
|
||||
self.textVar.set(str(x))
|
||||
|
||||
root = Tk()
|
||||
root.iconbitmap(os.path.join(sys.path[0], 'img', 'ico.ico'))
|
||||
root.resizable(False, False)
|
||||
app = App(root)
|
||||
root.mainloop()
|
||||
33
key_click_events.py
Normal file
33
key_click_events.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from tkinter import *
|
||||
|
||||
# I have no honest idea of what is going on here, but it works, so that's cool.
|
||||
|
||||
class Application(Frame):
|
||||
def __init__(self, master):
|
||||
Frame.__init__(self, master)
|
||||
self.master.minsize()
|
||||
self.master.config()
|
||||
|
||||
self.labelvar = StringVar()
|
||||
self.master.bind('<Key>', lambda event:self.met(event))
|
||||
# Bind seems to pass an event, lambda can handle it and pass this event to a def
|
||||
self.frame = Frame() # Frame within Frame? Hmm?
|
||||
self.frame.pack(fill='both', expand=True)
|
||||
self.label = Label(self, textvariable=self.labelvar) # Label for Keyboard String
|
||||
self.label.pack()
|
||||
self.pack()
|
||||
|
||||
# Handles keyboard updates, passes then to key(event) for printing without flush
|
||||
def met(self, event):
|
||||
self.key(event)
|
||||
self.labelvar.set(event.keysym)
|
||||
|
||||
|
||||
@staticmethod
|
||||
def key(event):
|
||||
print(event.keysym, end=' ', flush=True)
|
||||
|
||||
root = Tk()
|
||||
root.wm_attributes("-topmost", 1)
|
||||
app = Application(root)
|
||||
root.mainloop()
|
||||
20
keyboard_events.py
Normal file
20
keyboard_events.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import tkinter as tk
|
||||
|
||||
root = tk.Tk()
|
||||
|
||||
def key(event):
|
||||
print("pressed", repr(event.char))
|
||||
|
||||
def callback(event):
|
||||
frame.focus_set()
|
||||
print("clicked at", event.x, event.y)
|
||||
|
||||
frame = tk.Frame(root, width=100, height=100)
|
||||
label = tk.Label(frame, text="Help")
|
||||
frame.bind("<Key>", key)
|
||||
frame.bind("<Button-1>", callback)
|
||||
frame.pack()
|
||||
label.pack()
|
||||
|
||||
|
||||
root.mainloop()
|
||||
21
listbox.py
Normal file
21
listbox.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from tkinter import *
|
||||
|
||||
|
||||
|
||||
root = Tk()
|
||||
frame = Frame(root)
|
||||
listbox = Listbox(frame)
|
||||
|
||||
def callback(event):
|
||||
print('Callback', event)
|
||||
listbox.delete(ACTIVE)
|
||||
|
||||
frame.bind("<Double-Button-1>", callback)
|
||||
frame.pack()
|
||||
listbox.pack()
|
||||
|
||||
for i in range(20):
|
||||
listbox.insert(END, str(i))
|
||||
|
||||
|
||||
root.mainloop()
|
||||
42
msgbox.py
Normal file
42
msgbox.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from tkinter import *
|
||||
import ctypes, random
|
||||
|
||||
user32 = ctypes.windll.user32
|
||||
monitor_x,monitor_y = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
|
||||
print(monitor_x, monitor_y)
|
||||
|
||||
class Demo1:
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
self.frame = Frame(self.master)
|
||||
self.button1 = Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
|
||||
self.button1.pack()
|
||||
self.frame.pack()
|
||||
|
||||
def new_window(self):
|
||||
for x in range(1000):
|
||||
global monitor_x, monitor_y
|
||||
self.newWindow = Toplevel(self.master)
|
||||
width, height, xoffset, yoffset = 500, 150, random.randint(0, monitor_x), random.randint(0, monitor_y)
|
||||
self.newWindow.geometry("%dx%d%+d%+d" % (width, height, xoffset, yoffset))
|
||||
self.app = Demo2(self.newWindow)
|
||||
|
||||
class Demo2:
|
||||
def __init__(self, master):
|
||||
self.master = master
|
||||
self.frame = Frame(master)
|
||||
self.quitButton = Button(self.frame, text = 'Quit', command = self.close_windows)
|
||||
self.quitButton.pack()
|
||||
self.frame.pack()
|
||||
|
||||
def close_windows(self):
|
||||
self.master.destroy()
|
||||
|
||||
def main():
|
||||
root = Tk()
|
||||
root.geometry = ("+{}+{}".format(monitor_x, monitor_y))
|
||||
app = Demo1(root)
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
29
notebook.py
Normal file
29
notebook.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from tkinter import ttk
|
||||
from tkinter import *
|
||||
import random, string
|
||||
|
||||
|
||||
gen = lambda length, sample=string.ascii_letters : ''.join(random.choices(list(sample), k=length))
|
||||
|
||||
class Window(Frame):
|
||||
def __init__(self, master=None):
|
||||
self.master = master
|
||||
|
||||
# Master Notebook
|
||||
n = ttk.Notebook(root)
|
||||
tabs = []
|
||||
|
||||
for x in range(1, 21):
|
||||
tab = ttk.Frame(n)
|
||||
label = Label(tab, wraplength=500, text=gen(500))
|
||||
tabs.append((tab, label))
|
||||
|
||||
label.pack()
|
||||
n.add(tabs[-1][0], text='Tab ' + str(x))
|
||||
|
||||
n.grid(column=0, row=0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = Tk()
|
||||
app = Window(root)
|
||||
root.mainloop()
|
||||
14
randrange.py
Normal file
14
randrange.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from random import random
|
||||
import math
|
||||
|
||||
def gen():
|
||||
#int(return random()*(16)-12)
|
||||
return random()*(16)-12
|
||||
|
||||
top = gen()
|
||||
bot = gen()
|
||||
|
||||
for _ in range(5000000):
|
||||
top = max(gen(), top)
|
||||
bot = min(gen(), bot)
|
||||
print("bot {} top {}".format(bot, top))
|
||||
158
tictactoe.py
Normal file
158
tictactoe.py
Normal file
@@ -0,0 +1,158 @@
|
||||
from tkinter import *
|
||||
import os, sys, random, string
|
||||
|
||||
class App:
|
||||
def __init__(self, master):
|
||||
frame1 = Frame(master)
|
||||
frame2 = Frame(master)
|
||||
frame3 = Frame(master)
|
||||
frame4 = Frame(master)
|
||||
frame1.bind("<Key>", self.key)
|
||||
frame2.bind("<Key>", self.key)
|
||||
frame3.bind("<Key>", self.key)
|
||||
frame4.bind("<Key>", self.key)
|
||||
frame1.pack()
|
||||
frame2.pack()
|
||||
frame3.pack()
|
||||
frame4.pack()
|
||||
|
||||
self.vars = []
|
||||
self.marker = ["X", "O"]
|
||||
self.turn = True #True for p1, False for p2
|
||||
self.turnvar = StringVar()
|
||||
self.turnvar.set("Player " + self.getPlayer())
|
||||
for x in range(3):
|
||||
self.vars.append([])
|
||||
for y in range(3):
|
||||
self.vars[x].append(StringVar())
|
||||
self.vars[x][y].set("☐")
|
||||
|
||||
self.btns = [[], [], []]
|
||||
# Button 1 - Top Left
|
||||
self.btns[0].append(Button(frame1, textvariable=self.vars[0][0], command=lambda: self.btnUpdate(0,0)))
|
||||
self.btns[0][0].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 2 - Top Middle
|
||||
self.btns[0].append(Button(frame1, textvariable=self.vars[0][1], command=lambda: self.btnUpdate(0,1)))
|
||||
self.btns[0][1].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 3 - Top Right
|
||||
self.btns[0].append(Button(frame1, textvariable=self.vars[0][2], command=lambda: self.btnUpdate(0,2)))
|
||||
self.btns[0][2].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 4 - Middle Left
|
||||
self.btns[1].append(Button(frame2, textvariable=self.vars[1][0], command=lambda: self.btnUpdate(1,0)))
|
||||
self.btns[1][0].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 5 - Middle Middle
|
||||
self.btns[1].append(Button(frame2, textvariable=self.vars[1][1], command=lambda: self.btnUpdate(1,1)))
|
||||
self.btns[1][1].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 6 - Middle Right
|
||||
self.btns[1].append(Button(frame2, textvariable=self.vars[1][2], command=lambda: self.btnUpdate(1,2)))
|
||||
self.btns[1][2].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 7 - Bottom Left
|
||||
self.btns[2].append(Button(frame3, textvariable=self.vars[2][0], command=lambda: self.btnUpdate(2,0)))
|
||||
self.btns[2][0].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 8 - Bottom Middle
|
||||
self.btns[2].append(Button(frame3, textvariable=self.vars[2][1], command=lambda: self.btnUpdate(2,1)))
|
||||
self.btns[2][1].pack(side=LEFT, pady=5, padx=5)
|
||||
# Button 9 - Bottom Right
|
||||
self.btns[2].append(Button(frame3, textvariable=self.vars[2][2], command=lambda: self.btnUpdate(2,2)))
|
||||
self.btns[2][2].pack(side=LEFT, pady=5, padx=5)
|
||||
# Quit Button
|
||||
self.quit = Button(frame4, text='Quit', command=frame4.quit)
|
||||
self.quit.pack(side=LEFT, pady=5, padx=5)
|
||||
# Player Turn Label
|
||||
self.playerlabel = Label(frame4, textvariable=self.turnvar)
|
||||
self.playerlabel.pack(side=LEFT, pady=5, padx=5)
|
||||
|
||||
def key(self, event):
|
||||
print("pressed ", repr(event.char))
|
||||
|
||||
def cycle(self):
|
||||
self.turn = not self.turn
|
||||
|
||||
def printboard(self):
|
||||
for x in self.vars:
|
||||
for y in x:
|
||||
print(y.get(), end=' ')
|
||||
print()
|
||||
print()
|
||||
|
||||
def getPlayer(self, inverse=False):
|
||||
if(self.turn):
|
||||
return self.marker[0]
|
||||
else:
|
||||
return self.marker[1]
|
||||
|
||||
def rowSame(self, row):
|
||||
if len(row) > 1:
|
||||
cache = row[0]
|
||||
for x in row:
|
||||
if x != cache:
|
||||
return False
|
||||
cache = x
|
||||
if(row[0] == '☐'):
|
||||
return False
|
||||
return True
|
||||
|
||||
def checkBoard(self):
|
||||
for row in range(3):
|
||||
x1, x2, x3, y1, y2, y3 = row, row, row, 0, 1, 2
|
||||
if(self.vars[x1][y1].get() == self.vars[x2][y2].get() == self.vars[x3][y3].get()):
|
||||
self.winningBtns(x1, y1, x2, y2, x3, y3)
|
||||
return self.vars[x1][y1].get()
|
||||
|
||||
for col in range(3):
|
||||
x1, x2, x3, y1, y2, y3 = 0, 1, 2, col, col, col
|
||||
if(self.vars[x1][y1].get() == self.vars[x2][y2].get() == self.vars[x3][y3].get()):
|
||||
self.winningBtns(x1, y1, x2, y2, x3, y3)
|
||||
return self.vars[0][col].get()
|
||||
|
||||
x1, x2, x3, y1, y2, y3 = 0, 1, 2, 0, 1, 2
|
||||
if(self.vars[x1][y1].get() == self.vars[x2][y2].get() == self.vars[x3][y3].get()):
|
||||
self.winningBtns(x1, y1, x2, y2, x3, y3)
|
||||
return self.vars[1][1].get()
|
||||
|
||||
x1, x2, x3, y1, y2, y3 = 0, 1, 2, 2, 1, 0
|
||||
if(self.vars[x1][y1].get() == self.vars[x2][y2].get() == self.vars[x3][y3].get()):
|
||||
self.winningBtns(x1, y1, x2, y2, x3, y3)
|
||||
return self.vars[1][1].get()
|
||||
return '☐'
|
||||
|
||||
def winningBtns(self, x1, y1, x2, y2, x3, y3):
|
||||
x = [self.vars[x1][y1].get(), self.vars[x2][y2].get(), self.vars[x3][y3].get()]
|
||||
for y in x:
|
||||
if y == '☐':
|
||||
return False
|
||||
print("WinningBtns --- {},{} {},{} {},{}".format(x1, y1, x2, y2, x3, y3))
|
||||
self.btns[x1][y1].config(disabledforeground='red')
|
||||
self.btns[x2][y2].config(disabledforeground='red')
|
||||
self.btns[x3][y3].config(disabledforeground='red')
|
||||
|
||||
def update(self):
|
||||
self.printboard()
|
||||
response = self.checkBoard()
|
||||
if(response != '☐'):
|
||||
print("Winner: " + response)
|
||||
self.disableAll()
|
||||
else:
|
||||
self.cycle()
|
||||
self.turnvar.set("Player " + self.getPlayer())
|
||||
|
||||
def disableAll(self):
|
||||
for x in range(3):
|
||||
for y in range(3):
|
||||
self.btns[x][y].config(state='disabled')
|
||||
|
||||
# Update game board based on who's turn
|
||||
def btnUpdate(self, x, y):
|
||||
self.btns[x][y].config(state="disabled")
|
||||
self.vars[x][y].set(self.getPlayer())
|
||||
self.update()
|
||||
|
||||
root = Tk()
|
||||
root.wm_attributes("-topmost", 1)
|
||||
root.overrideredirect(1) # Disable Titlebar
|
||||
root.iconbitmap(os.path.join(sys.path[0], 'img', 'ico.ico')) # Icon for Application
|
||||
root.resizable(False, False) #Disable resizing
|
||||
root.geometry("+1000+500") #Make it appear in the middle
|
||||
|
||||
app = App(root)
|
||||
root.mainloop()
|
||||
32
treeview_filter_test.py
Normal file
32
treeview_filter_test.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
import faker, random
|
||||
|
||||
fake = faker.Faker()
|
||||
|
||||
class App(tk.Frame):
|
||||
def __init__(self, parent):
|
||||
self.parent = parent
|
||||
self.tree = ttk.Treeview(self.parent, columns=['Name'])
|
||||
self.button = tk.Entry(self.parent, )
|
||||
self.tree.heading('#0', text='Index')
|
||||
self.tree.heading('#1', text='Name')
|
||||
self.tree.column('#0', anchor=tk.CENTER)
|
||||
self.tree.column('#1', anchor=tk.CENTER)
|
||||
|
||||
self.items = []
|
||||
for _ in range(10):
|
||||
self.items.append(self.tree.insert('', 'end', text=_+1, values=(fake.name())))
|
||||
|
||||
self.button.grid(column=0, row=0, columnspan=1, rowspan=1, padx=5, pady=5, sticky='NEWS')
|
||||
self.tree.grid(column=0, row=1, columnspan=3, rowspan=1, padx=5, pady=5)
|
||||
|
||||
def update(self):
|
||||
print('Update received')
|
||||
self.tree.detach(random.choice(self.items))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = tk.Tk()
|
||||
app = App(root)
|
||||
root.mainloop()
|
||||
75
treeview_sample.py
Normal file
75
treeview_sample.py
Normal file
@@ -0,0 +1,75 @@
|
||||
'''
|
||||
Created on Mar 21, 2016
|
||||
|
||||
@author: Bill Begueradj
|
||||
'''
|
||||
import tkinter as Tkinter
|
||||
from tkinter import ttk
|
||||
|
||||
class Begueradj(Tkinter.Frame):
|
||||
'''
|
||||
classdocs
|
||||
'''
|
||||
def __init__(self, parent):
|
||||
'''
|
||||
Constructor
|
||||
'''
|
||||
Tkinter.Frame.__init__(self, parent)
|
||||
self.parent=parent
|
||||
self.initialize_user_interface()
|
||||
|
||||
def initialize_user_interface(self):
|
||||
"""Draw a user interface allowing the user to type
|
||||
items and insert them into the treeview
|
||||
"""
|
||||
self.parent.title("Canvas Test")
|
||||
self.parent.grid_rowconfigure(0,weight=1)
|
||||
self.parent.grid_columnconfigure(0,weight=1)
|
||||
self.parent.config(background="lavender")
|
||||
|
||||
|
||||
# Define the different GUI widgets
|
||||
self.dose_label = Tkinter.Label(self.parent, text = "Dose:")
|
||||
self.dose_entry = Tkinter.Entry(self.parent)
|
||||
self.dose_label.grid(row = 0, column = 0, sticky = Tkinter.W)
|
||||
self.dose_entry.grid(row = 0, column = 1)
|
||||
|
||||
self.modified_label = Tkinter.Label(self.parent, text = "Date Modified:")
|
||||
self.modified_entry = Tkinter.Entry(self.parent)
|
||||
self.modified_label.grid(row = 1, column = 0, sticky = Tkinter.W)
|
||||
self.modified_entry.grid(row = 1, column = 1)
|
||||
|
||||
self.submit_button = Tkinter.Button(self.parent, text = "Insert", command = self.insert_data)
|
||||
self.submit_button.grid(row = 2, column = 1, sticky = Tkinter.W)
|
||||
self.exit_button = Tkinter.Button(self.parent, text = "Exit", command = self.parent.quit)
|
||||
self.exit_button.grid(row = 0, column = 3)
|
||||
|
||||
# Set the treeview
|
||||
self.tree = ttk.Treeview( self.parent, columns=('Dose', 'Modification date'))
|
||||
self.tree.heading('#0', text='Item')
|
||||
self.tree.heading('#1', text='Dose')
|
||||
self.tree.heading('#2', text='Modification Date')
|
||||
self.tree.column('#1', stretch=Tkinter.YES)
|
||||
self.tree.column('#2', stretch=Tkinter.YES)
|
||||
self.tree.column('#0', stretch=Tkinter.YES)
|
||||
self.tree.grid(row=4, columnspan=4, sticky='nsew')
|
||||
self.treeview = self.tree
|
||||
# Initialize the counter
|
||||
self.i = 0
|
||||
|
||||
|
||||
def insert_data(self):
|
||||
"""
|
||||
Insertion method.
|
||||
"""
|
||||
self.treeview.insert('', 'end', text="Item_"+str(self.i), values=(self.dose_entry.get()+" mg", self.modified_entry.get()))
|
||||
# Increment counter
|
||||
self.i = self.i + 1
|
||||
|
||||
def main():
|
||||
root=Tkinter.Tk()
|
||||
d=Begueradj(root)
|
||||
root.mainloop()
|
||||
|
||||
if __name__=="__main__":
|
||||
main()
|
||||
48
treeview_selection_set.py
Normal file
48
treeview_selection_set.py
Normal file
@@ -0,0 +1,48 @@
|
||||
from tkinter import *
|
||||
from tkinter import ttk
|
||||
import string, random, faker
|
||||
|
||||
fake = faker.Faker()
|
||||
|
||||
class App:
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
self.tree = ttk.Treeview(self.root, columns=['Integer'])
|
||||
self.button = Button(root, text='Randomly Choose', command=self.randomSet)
|
||||
self.button2 = Button(root, text='Randomly Choose2', command=self.randomSet)
|
||||
self.button1 = Button(root, text='Randomly Choose1', command=self.randomSet)
|
||||
|
||||
# Create values
|
||||
# rnd = lambda x : ''.join(random.choices(list(string.ascii_letters), k=x))
|
||||
self.values = [fake.name() for i in range(1, 30)]
|
||||
|
||||
# Create tree ids and insert values
|
||||
self.tree.heading('#0', text='String')
|
||||
self.tree.heading('#1', text='Integer')
|
||||
self.tree.column('#0', anchor=CENTER)
|
||||
self.tree.column('#1', anchor=CENTER)
|
||||
|
||||
self.ids = []
|
||||
for value in self.values:
|
||||
tree_id = self.tree.insert("", "end", text=value, values=random.randint(0, len(self.values)))
|
||||
self.ids.append(tree_id)
|
||||
|
||||
# Grid buttons and tree
|
||||
self.tree.grid(column=0, row=0, columnspan=3, padx=5, pady=5)
|
||||
self.button2.grid(column=2, row=1, columnspan=1, padx=5, pady=5, sticky=N+E+W+S)
|
||||
self.button1.grid(column=1, row=1, columnspan=1, padx=5, pady=5, sticky=N+E+W+S)
|
||||
self.button.grid(column=0, row=1, columnspan=1, padx=5, pady=5, sticky=N+E+W+S)
|
||||
|
||||
# Selection items randomly
|
||||
def randomSet(self):
|
||||
minLength = int(len(self.ids) / 2.0)
|
||||
self.choices = []
|
||||
while len(self.choices) < minLength:
|
||||
choice = random.choice(self.ids)
|
||||
if choice not in self.choices:
|
||||
self.choices.append(choice)
|
||||
self.tree.selection_set(self.choices)
|
||||
|
||||
root = Tk()
|
||||
App(root)
|
||||
root.mainloop()
|
||||
66
treeview_test.py
Normal file
66
treeview_test.py
Normal file
@@ -0,0 +1,66 @@
|
||||
import random, datetime
|
||||
from tkinter import ttk
|
||||
from tkinter import *
|
||||
|
||||
class Window(Frame):
|
||||
def __init__(self, parent):
|
||||
Frame.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.init_interface()
|
||||
|
||||
def init_interface(self):
|
||||
# Window Configurations
|
||||
self.parent.title("Window Title")
|
||||
self.parent.config(background="lavender")
|
||||
# self.parent.grid_rowconfigure(0, weight=1)
|
||||
# self.parent.grid_columnconfigure(0, weight=1)
|
||||
|
||||
# Item Name Area
|
||||
self.item_label = Label(self.parent, text="Name:", bg="lavender")
|
||||
self.item_entry = Entry(self.parent)
|
||||
self.item_label.grid(row=0, column=0, sticky=E, ipadx=2, ipady=2, padx=5, pady=5)
|
||||
self.item_entry.grid(row=0, column=1, sticky=W, padx=5, pady=5)
|
||||
|
||||
# Doses Area
|
||||
self.dose_label = Label(self.parent, text="Dose:", bg="lavender")
|
||||
self.dose_entry = Entry(self.parent)
|
||||
self.dose_label.grid(row=1, column=0, sticky=E, ipadx=2, ipady=2, padx=5, pady=5)
|
||||
self.dose_entry.grid(row=1, column=1, sticky=W, padx=5, pady=5)
|
||||
|
||||
# Date Area
|
||||
self.date_label = Label(self.parent, text="Date Modified:", bg="lavender")
|
||||
self.date_entry = Entry(self.parent)
|
||||
self.date_label.grid(row=2, column=0, sticky=E, padx=5, pady=5)
|
||||
self.date_entry.grid(row=2, column=1, sticky=W, padx=5, pady=5)
|
||||
|
||||
# Button Area
|
||||
self.submit_button = Button(self.parent, text="Insert", command=self.insert_data)
|
||||
self.exit_button = Button(self.parent, text = "Exit", command=self.parent.quit)
|
||||
self.submit_button.grid(row=1, column=2, rowspan=3, padx=5, pady=5, ipadx=15, ipady=15)
|
||||
self.exit_button.grid(row=1, column=3, rowspan=3, padx=5, pady=5, ipadx=15, ipady=15)
|
||||
|
||||
# Tree View Setup
|
||||
self.i = 0
|
||||
self.tree = ttk.Treeview(self.parent, columns=('Dose', 'Modification Date'))
|
||||
for index, string in enumerate(['Item', 'Dose', 'Modification Date']):
|
||||
self.tree.heading('#{}'.format(index), text=string)
|
||||
self.tree.column('#{}'.format(index), stretch=YES)
|
||||
self.tree.grid(row=3, column=0, columnspan=4, padx=5, pady=(0, 5))
|
||||
|
||||
def insert_data(self):
|
||||
# Require dose entry
|
||||
time = datetime.datetime.now().strftime("%B %d, %Y %I:%M:%S %p")
|
||||
if self.date_entry.get() != "": # If timestamp is provided
|
||||
time = self.date_entry.get()
|
||||
mg = "{} mg".format(self.dose_entry.get())
|
||||
text = "Item_{}".format(self.i)
|
||||
self.tree.insert('', 'end', text=text, values=(mg, time))
|
||||
self.i += 1
|
||||
|
||||
def main():
|
||||
root = Tk()
|
||||
x = Window(root)
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
41
unit2quiz.py
Normal file
41
unit2quiz.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from tkinter import *
|
||||
import random, sys, os, ctypes
|
||||
|
||||
class App:
|
||||
def __init__(self, master):
|
||||
self.frame1 = Frame(master)
|
||||
self.frame2 = Frame(master)
|
||||
self.frame1.pack()
|
||||
self.frame2.pack()
|
||||
|
||||
self.query = StringVar()
|
||||
self.query.set("Question")
|
||||
|
||||
self.label = Label(self.frame1, textvariable=self.query)
|
||||
self.label.pack(padx=5, pady=5)
|
||||
|
||||
# Quit Button
|
||||
self.quit = Button(self.frame2, text="Quit", command=self.frame2.quit)
|
||||
self.quit.pack(padx=5, pady=5)
|
||||
|
||||
root = Tk()
|
||||
root.wm_attributes("-topmost", 1)
|
||||
root.overrideredirect(1) # Disable Titlebar
|
||||
root.iconbitmap(os.path.join(sys.path[0], 'img', 'ico.ico')) # Icon for Application
|
||||
root.resizable(False, False) #Disable resizing
|
||||
|
||||
# get screen res for windows
|
||||
app = App(root)
|
||||
|
||||
user32 = ctypes.windll.user32
|
||||
x,y = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1) # Monitor Height/Width Tuple
|
||||
h,w = root.winfo_width(), root.winfo_height() # Window Height/Width Tuple
|
||||
x,y = x-h, y-w
|
||||
|
||||
print("x","y")
|
||||
print(x,y)
|
||||
print("h","w")
|
||||
print(h,w)
|
||||
|
||||
root.geometry("+{}+{}".format(x//2,y//2)) #Make it appear in the middle
|
||||
root.mainloop()
|
||||
Reference in New Issue
Block a user