else
This commit is contained in:
parent
d533392b7d
commit
b659866a97
10 changed files with 485 additions and 0 deletions
46
EntryWithHistory/entrywithhistory.py
Normal file
46
EntryWithHistory/entrywithhistory.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
import tkinter
|
||||
|
||||
class EntryWithHistory(tkinter.Entry):
|
||||
def __init__(self, master, submithook, *args, **kwargs):
|
||||
super(EntryWithHistory, self).__init__(master, *args, **kwargs)
|
||||
self.previousinputs = []
|
||||
self.previousinputstep = 0
|
||||
|
||||
self.submithook = submithook
|
||||
|
||||
self.bind('<Return>', self.submit)
|
||||
self.bind('<Escape>', lambda b: self.delete(0, 'end'))
|
||||
self.bind('<Up>', self.previous_back)
|
||||
self.bind('<Down>', self.previous_forward)
|
||||
|
||||
def submit(self, *b):
|
||||
x = self.get()
|
||||
x = x.lower()
|
||||
noskip = '!' in x
|
||||
if 2 < len(x) < 21:
|
||||
if len(self.previousinputs) == 0 or self.previousinputs[-1] != x:
|
||||
self.previousinputs.append(x)
|
||||
self.previousinputstep = 0
|
||||
self.submithook(x)
|
||||
self.delete(0, 'end')
|
||||
|
||||
def previous_back(self, *b):
|
||||
self.previous_step(-1)
|
||||
|
||||
def previous_forward(self, *b):
|
||||
self.previous_step(1)
|
||||
|
||||
def previous_step(self, direction):
|
||||
self.previousinputstep += direction
|
||||
if abs(self.previousinputstep) > len(self.previousinputs):
|
||||
self.previousinputstep -= direction
|
||||
return
|
||||
self.delete(0, 'end')
|
||||
if self.previousinputstep >= 0:
|
||||
self.previousinputstep = 0
|
||||
return
|
||||
self.insert(0, self.previousinputs[self.previousinputstep])
|
||||
t = tkinter.Tk()
|
||||
e=EntryWithHistory(t, print)
|
||||
e.pack()
|
||||
t.mainloop()
|
15
Jobs/job_example.py
Normal file
15
Jobs/job_example.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
import jobs
|
||||
import time
|
||||
|
||||
def continuous_register():
|
||||
print('w')
|
||||
jobs.register(2, continuous_register)
|
||||
|
||||
jobs.register(5, print, args=('heyo',))
|
||||
time.sleep(10)
|
||||
print('x')
|
||||
jobs.register(5, print, args=('heyo',))
|
||||
time.sleep(2)
|
||||
jobs.unregister(print, args=('heyo', ), kwargs={})
|
||||
time.sleep(10)
|
||||
print('y')
|
52
Jobs/jobs.py
Normal file
52
Jobs/jobs.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
import signal
|
||||
import time
|
||||
import threading
|
||||
|
||||
class JobInterruption(Exception):
|
||||
pass
|
||||
|
||||
class JobSchedulingError(Exception):
|
||||
pass
|
||||
|
||||
THREAD = None
|
||||
JOBS = {}
|
||||
def thread_manager():
|
||||
while True:
|
||||
now = time.time()
|
||||
for (functionid, joblist) in JOBS.items():
|
||||
for job in joblist:
|
||||
if now < job[0]:
|
||||
continue
|
||||
job[1](*job[2], **job[3])
|
||||
joblist.remove(job)
|
||||
time.sleep(0.5)
|
||||
|
||||
def launch_thread():
|
||||
global THREAD
|
||||
if THREAD is None or THREAD.is_alive is False:
|
||||
THREAD = threading.Thread(target=thread_manager)
|
||||
THREAD.daemon = True
|
||||
THREAD.start()
|
||||
|
||||
def register(seconds_from_now, function, args=[], kwargs={}):
|
||||
if seconds_from_now <= 0:
|
||||
raise JobSchedulingError('cannot schedule jobs for the past')
|
||||
iid = id(function)
|
||||
schedule = time.time() + seconds_from_now
|
||||
if iid not in JOBS:
|
||||
JOBS[iid] = [(schedule, function, args, kwargs)]
|
||||
else:
|
||||
JOBS[iid].append( (schedule, function, args, kwargs) )
|
||||
launch_thread()
|
||||
|
||||
def unregister_all(function):
|
||||
iid = id(function)
|
||||
if iid in JOBS:
|
||||
del JOBS[iid]
|
||||
|
||||
def unregister(function, args, kwargs):
|
||||
joblist = JOBS[id(function)]
|
||||
for job in joblist:
|
||||
if job[1:] != (function, args, kwargs):
|
||||
continue
|
||||
joblist.remove(job)
|
4
Syshub/README.md
Normal file
4
Syshub/README.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
SysHub
|
||||
=======
|
||||
|
||||
This is probably a terrible idea. It actually kind of works but not 100%.
|
118
Syshub/syshub.py
Normal file
118
Syshub/syshub.py
Normal file
|
@ -0,0 +1,118 @@
|
|||
'''
|
||||
This module allows the user to redirect sys.stdout, stdin, and exceptions
|
||||
streams (referred to as std* collectively) on a per-module basis. That is,
|
||||
a main program can import both moduleA and moduleB, then register them here
|
||||
so that any print statements or prompts in the modules will behave differently.
|
||||
'''
|
||||
|
||||
import inspect
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
class SysRouter:
|
||||
def __init__(self):
|
||||
if self.__class__.ROUTER_EXISTS:
|
||||
raise ValueError('You may only instantiate one of each SysRouter')
|
||||
self.__class__.ROUTER_EXISTS = True
|
||||
|
||||
def router_get_caller(self, key, default, jumps=0):
|
||||
stack = inspect.stack()
|
||||
|
||||
calling_frame = stack[2+jumps][0]
|
||||
calling_module = inspect.getmodule(calling_frame)
|
||||
if calling_module is None:
|
||||
try:
|
||||
calling_frame = stack[3+jumps][0]
|
||||
calling_module = inspect.getmodule(calling_frame)
|
||||
calling_name = calling_module.__name__
|
||||
except:
|
||||
calling_name = ''
|
||||
else:
|
||||
calling_name = calling_module.__name__
|
||||
|
||||
rerouted = SYSHUB_MAP.get(calling_name, {}).get(key, default)
|
||||
return rerouted
|
||||
|
||||
class SysRouterOut(SysRouter):
|
||||
ROUTER_EXISTS = False
|
||||
|
||||
def flush(self):
|
||||
STDOUT.flush()
|
||||
|
||||
def write(self, data):
|
||||
rerouted = self.router_get_caller('out', STDOUT.write)
|
||||
return rerouted(data)
|
||||
|
||||
class SysRouterIn(SysRouter):
|
||||
ROUTER_EXISTS = False
|
||||
|
||||
def readline(self):
|
||||
rerouted = self.router_get_caller('in', STDIN.readline)
|
||||
return rerouted()
|
||||
|
||||
#class SysRouterErr(SysRouter):
|
||||
# ROUTER_EXISTS = False
|
||||
#
|
||||
# def flush(self):
|
||||
# STDERR.flush()
|
||||
#
|
||||
# def write(self, data):
|
||||
# rerouted = self.router_get_caller('out', STDERR.write)
|
||||
# return rerouted(data)
|
||||
|
||||
class SysRouterExc(SysRouter):
|
||||
ROUTER_EXISTS = False
|
||||
|
||||
def __call__(self, exception_type, exception_instance, trace):
|
||||
caller = traceback._format_exception_iter(ValueError, exception_instance, trace,None, None)
|
||||
caller = list(caller)[-2]
|
||||
caller = caller.split('"')[1]
|
||||
caller = caller.replace('\\', '/')
|
||||
caller = caller.split('/')[-1]
|
||||
caller = caller.split('.')[0]
|
||||
rerouted = SYSHUB_MAP.get(caller, {}).get('exc', EXCEPTHOOK)
|
||||
rerouted(exception_type, exception_instance, trace)
|
||||
|
||||
SYSHUB_MAP = {}
|
||||
|
||||
STDOUT = sys.stdout
|
||||
STDIN = sys.stdin
|
||||
#STDERR = sys.stderr
|
||||
EXCEPTHOOK = sys.excepthook
|
||||
sys.stdout = SysRouterOut()
|
||||
sys.stdin = SysRouterIn()
|
||||
#sys.stderr = SysRouterErr()
|
||||
sys.excepthook = SysRouterExc()
|
||||
|
||||
def register(module, calltype, method):
|
||||
'''
|
||||
Register a module in the syshub map.
|
||||
|
||||
When the module performs an input, output, or err operation, Syshub will
|
||||
check the map so see if it should redirect the call to the provided
|
||||
method.
|
||||
|
||||
Registered modules will not affect the behavior of unregistered modules.
|
||||
|
||||
Rerouting a module's 'out' will not affect that module's 'in', etc.
|
||||
|
||||
-----
|
||||
|
||||
parameters:
|
||||
module = the module object from which calls will be rerouted.
|
||||
calltype = one of {'out', 'in', 'exc}, corresponding to sys.std*
|
||||
and sys.excepthook
|
||||
method = the method to which any arguments intended for the std* method
|
||||
will be passed.
|
||||
|
||||
-----
|
||||
|
||||
SYSHUB_MAP is kept in the format:
|
||||
|
||||
{module: {'out': method, 'in': method, 'exc': method}}
|
||||
'''
|
||||
i = module.__name__
|
||||
if i in SYSHUB_MAP:
|
||||
SYSHUB_MAP[i][calltype] = method
|
||||
else:
|
||||
SYSHUB_MAP[i] = {calltype: method}
|
48
Syshub/syshub_example_manager.py
Normal file
48
Syshub/syshub_example_manager.py
Normal file
|
@ -0,0 +1,48 @@
|
|||
import inspect
|
||||
import syshub
|
||||
import syshub_example_slave as slave
|
||||
import syshub_example_slave2 as slave2
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
def print_from_slave(data):
|
||||
if data not in ('\n', ''):
|
||||
data = 'SLAVE]: ' + data
|
||||
sys.stdout.write(data)
|
||||
sys.stdout.flush()
|
||||
return len(data)
|
||||
|
||||
def input_from_slave():
|
||||
sys.stdout.write('\n')
|
||||
return 'robots'
|
||||
|
||||
def exception_from_slave(exception_type, exception_instance, trace):
|
||||
message = traceback.format_exception(exception_type, exception_instance, trace)
|
||||
message = ''.join(message)
|
||||
message = 'SLAVE]: ' + message.replace('\n', '\nSLAVE]: ')
|
||||
sys.stderr.write(message)
|
||||
sys.stderr.flush()
|
||||
return len(message)
|
||||
|
||||
def print_from_slave2(data):
|
||||
if data not in ('\n', ''):
|
||||
data = 'SLAV2]: ' + data
|
||||
sys.stdout.write(data)
|
||||
sys.stdout.flush()
|
||||
return len(data)
|
||||
|
||||
def input_from_slave2():
|
||||
return input('type here> ')
|
||||
|
||||
syshub.register(module=slave, calltype='out', method=print_from_slave)
|
||||
syshub.register(module=slave, calltype='in', method=input_from_slave)
|
||||
syshub.register(module=slave, calltype='exc', method=exception_from_slave)
|
||||
|
||||
syshub.register(module=slave2, calltype='out', method=print_from_slave2)
|
||||
syshub.register(module=slave2, calltype='in', method=input_from_slave2)
|
||||
#print(syshub.SYSHUB_MAP)
|
||||
slave.say_something()
|
||||
slave.input_something()
|
||||
slave2.say_something()
|
||||
slave2.input_something()
|
||||
slave.raise_something()
|
14
Syshub/syshub_example_slave.py
Normal file
14
Syshub/syshub_example_slave.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
'''
|
||||
Notice how this file does not import syshub or know about it
|
||||
in any way.
|
||||
'''
|
||||
import sys
|
||||
def say_something():
|
||||
print('hello')
|
||||
|
||||
def input_something():
|
||||
print('prompt: ', end='')
|
||||
print(sys.stdin.readline())
|
||||
|
||||
def raise_something():
|
||||
raise ValueError
|
16
Syshub/syshub_example_slave2.py
Normal file
16
Syshub/syshub_example_slave2.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
'''
|
||||
Notice how this file does not import syshub or know about it
|
||||
in any way.
|
||||
'''
|
||||
import sys
|
||||
def say_something():
|
||||
print('hello')
|
||||
|
||||
def input_something():
|
||||
print('prompt: ', end='')
|
||||
b = sys.stdin.readline()
|
||||
print(b)
|
||||
|
||||
def raise_something():
|
||||
print(sys.excepthook)
|
||||
raise ValueError
|
172
Syshub/syshub_reddits.py
Normal file
172
Syshub/syshub_reddits.py
Normal file
|
@ -0,0 +1,172 @@
|
|||
import sys
|
||||
import syshub
|
||||
import tkinter
|
||||
|
||||
class EntryWithHistory(tkinter.Entry):
|
||||
def __init__(self, master, submithook, *args, **kwargs):
|
||||
super(EntryWithHistory, self).__init__(master, *args, **kwargs)
|
||||
self.previousinputs = []
|
||||
self.previousinputstep = 0
|
||||
|
||||
self.submithook = submithook
|
||||
|
||||
self.bind('<Return>', self.submit)
|
||||
self.bind('<Escape>', lambda b: self.delete(0, 'end'))
|
||||
self.bind('<Up>', self.previous_back)
|
||||
self.bind('<Down>', self.previous_forward)
|
||||
|
||||
def submit(self, *b):
|
||||
x = self.get()
|
||||
x = x.lower()
|
||||
noskip = '!' in x
|
||||
if 2 < len(x) < 21:
|
||||
if len(self.previousinputs) == 0 or self.previousinputs[-1] != x:
|
||||
self.previousinputs.append(x)
|
||||
self.previousinputstep = 0
|
||||
self.submithook(x)
|
||||
self.delete(0, 'end')
|
||||
|
||||
def previous_back(self, *b):
|
||||
self.previous_step(-1)
|
||||
|
||||
def previous_forward(self, *b):
|
||||
self.previous_step(1)
|
||||
|
||||
def previous_step(self, direction):
|
||||
self.previousinputstep += direction
|
||||
if abs(self.previousinputstep) > len(self.previousinputs):
|
||||
self.previousinputstep -= direction
|
||||
return
|
||||
self.delete(0, 'end')
|
||||
if self.previousinputstep >= 0:
|
||||
self.previousinputstep = 0
|
||||
return
|
||||
self.insert(0, self.previousinputs[self.previousinputstep])
|
||||
|
||||
class InterpreterWindow(tkinter.Frame):
|
||||
def __init__(self, master, module, *args, **kwargs):
|
||||
super(InterpreterWindow, self).__init__(master, *args, **kwargs)
|
||||
|
||||
self.module = module
|
||||
|
||||
self.frame = tkinter.Frame(master, height=512)
|
||||
self.display = tkinter.Label(self.frame, anchor='sw', justify='left', font=('Terminal',10))
|
||||
self.display.configure(wraplength=self.display.winfo_width(), bg='#272822', fg='#e6db74')
|
||||
self.input = EntryWithHistory(self.frame, self.input_text, font=('Terminal', 10), bg='#000', fg='#e6db74')
|
||||
self.input.configure(insertbackground='#e6db74')
|
||||
|
||||
self.frame.bind('<Configure>', self.update_wraplength)
|
||||
|
||||
self.display_buffer = ['wtf', 'w']
|
||||
self.frame.rowconfigure(0, weight=1)
|
||||
self.frame.columnconfigure(0, weight=1)
|
||||
self.display.grid(row=0, column=0, sticky='news')
|
||||
self.input.grid(row=1, column=0, sticky='ew')
|
||||
master.update()
|
||||
self.frame.pack_propagate(0)
|
||||
self.frame.grid_propagate(0)
|
||||
|
||||
self.update_display()
|
||||
|
||||
def update_display(self):
|
||||
display = '\n'.join(self.display_buffer)
|
||||
self.display.configure(text=display)
|
||||
self.display.update()
|
||||
|
||||
def input_text(self, text):
|
||||
text = text.strip()
|
||||
if text is '':
|
||||
return
|
||||
d = '>>> ' + text
|
||||
self.display_buffer.append(d)
|
||||
self.update_display()
|
||||
self.input.configure(state='disabled')
|
||||
self.input.update()
|
||||
self.module.execit(text)
|
||||
self.input.configure(state='normal')
|
||||
|
||||
def update_wraplength(self, *trash):
|
||||
self.display.configure(wraplength=self.display.winfo_width())
|
||||
|
||||
def syshub_receiver(self, text):
|
||||
text = text.strip()
|
||||
if text is '':
|
||||
return
|
||||
self.display_buffer.append(text)
|
||||
self.update_display()
|
||||
|
||||
def previous_back(self, *b):
|
||||
self.previous_step(-1)
|
||||
|
||||
def previous_forward(self, *b):
|
||||
self.previous_step(1)
|
||||
|
||||
def previous_step(self, direction):
|
||||
self.previousinputstep += direction
|
||||
if abs(self.previousinputstep) > len(self.previousinputs):
|
||||
self.previousinputstep -= direction
|
||||
return
|
||||
self.input.delete(0, 'end')
|
||||
if self.previousinputstep >= 0:
|
||||
self.previousinputstep = 0
|
||||
return
|
||||
self.input.insert(0, self.previousinputs[self.previousinputstep])
|
||||
|
||||
def pack(self, *args, **kwargs):
|
||||
self.frame.pack(*args, **kwargs)
|
||||
|
||||
def grid(self, *args, **kwargs):
|
||||
self.frame.grid(*args, **kwargs)
|
||||
|
||||
def place(self, *args, **kwargs):
|
||||
self.frame.place(*args, **kwargs)
|
||||
|
||||
class QuadTK:
|
||||
def __init__(self):
|
||||
self.windowtitle = 'QuadTK'
|
||||
|
||||
self.t = tkinter.Tk()
|
||||
self.t.title(self.windowtitle)
|
||||
self.w = 800
|
||||
self.h = 525
|
||||
self.screenwidth = self.t.winfo_screenwidth()
|
||||
self.screenheight = self.t.winfo_screenheight()
|
||||
self.windowwidth = self.w
|
||||
self.windowheight = self.h
|
||||
self.windowx = (self.screenwidth-self.windowwidth) / 2
|
||||
self.windowy = ((self.screenheight-self.windowheight) / 2) - 27
|
||||
self.geometrystring = '%dx%d+%d+%d' % (self.windowwidth, self.windowheight, self.windowx, self.windowy)
|
||||
self.t.geometry(self.geometrystring)
|
||||
|
||||
self.build_gui_manager()
|
||||
|
||||
self.t.mainloop()
|
||||
|
||||
p = sys.path[0]
|
||||
|
||||
sys.path[0] = 'C:/git/reddit/subredditbirthdays/'
|
||||
import sb
|
||||
sys.path[0] = 'C:/git/reddit/usernames/'
|
||||
import un
|
||||
sys.path[0] = 'C:/git/reddit/t3/'
|
||||
import t3
|
||||
|
||||
t = tkinter.Tk()
|
||||
t.columnconfigure(0, weight=1)
|
||||
t.rowconfigure(0, weight=1)
|
||||
t.rowconfigure(1, weight=1)
|
||||
t.rowconfigure(2, weight=1)
|
||||
|
||||
sbi = InterpreterWindow(t, sb)
|
||||
sbi.grid(row=0, column=0, sticky='news')
|
||||
syshub.register(module=sb, calltype='out', method=sbi.syshub_receiver)
|
||||
|
||||
uni = InterpreterWindow(t, un)
|
||||
uni.grid(row=1, column=0, sticky='news')
|
||||
syshub.register(module=un, calltype='out', method=uni.syshub_receiver)
|
||||
|
||||
t3i = InterpreterWindow(t, t3)
|
||||
t3i.grid(row=2, column=0, sticky='news')
|
||||
syshub.register(module=t3, calltype='out', method=t3i.syshub_receiver)
|
||||
|
||||
t.mainloop()
|
BIN
Toddo/toddo.db
BIN
Toddo/toddo.db
Binary file not shown.
Loading…
Reference in a new issue