From 93b72ca515f48379b24c1e96701c91e29d60e068 Mon Sep 17 00:00:00 2001 From: Voussoir Date: Thu, 30 Apr 2015 17:51:49 -0700 Subject: [PATCH] else Heroku Bot! --- Datapoint/datapoint.py | 125 ++++++++++++ HerokuBot/Procfile | 2 + HerokuBot/README.md | 75 +++++++ HerokuBot/git.zip | Bin 0 -> 32604 bytes HerokuBot/herokubot.py | 16 ++ HerokuBot/requirements.txt | 1 + HerokuBot/runtime.txt | 1 + Logogame/images/kagenui.png | Bin 51912 -> 0 bytes Logogame/logos.py | 381 ------------------------------------ TKdraw/tkdraw.py | 59 ++++++ 10 files changed, 279 insertions(+), 381 deletions(-) create mode 100644 Datapoint/datapoint.py create mode 100644 HerokuBot/Procfile create mode 100644 HerokuBot/README.md create mode 100644 HerokuBot/git.zip create mode 100644 HerokuBot/herokubot.py create mode 100644 HerokuBot/requirements.txt create mode 100644 HerokuBot/runtime.txt delete mode 100644 Logogame/images/kagenui.png delete mode 100644 Logogame/logos.py create mode 100644 TKdraw/tkdraw.py diff --git a/Datapoint/datapoint.py b/Datapoint/datapoint.py new file mode 100644 index 0000000..33242d3 --- /dev/null +++ b/Datapoint/datapoint.py @@ -0,0 +1,125 @@ +import tkinter + +class DataPoint: + def __init__(self, width=720, height=480): + self.windowtitle = 'DataPoint' + + self.t = tkinter.Tk() + self.t.title(self.windowtitle) + self.w = width + self.h = height + 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.reset_attributes() + + self.margin = 0.10 + self.c = tkinter.Canvas(self.t) + self.c.pack(fill='both', expand=True) + + self.clear() + + def mainloop(self): + self.t.mainloop() + + def reset_attributes(self): + ''' + Set the DataPoint's grid attributes back to None + so that they will be recalculated during the next plot + ''' + self.lowestx = None + self.highestx = None + self.lowesty = None + self.highesty = None + self.spanx = None + self.spany = None + self.marginx = None + self.marginy = None + self.drawablew = None + self.drawableh = None + + def clear(self): + self.c.delete('all') + + def meow(self): + return 'meow.' + + def function(self, x): + x -= 50 + x *= 0.1 + y = 1 / (1 + (2.718 ** -x)) + return y + + def verifypoints(self, points): + for item in points: + if len(item) != 2: + raise Exception('%s Incorrect number of values for coordinate. Use help(plotpoints)' % str(item)) + for subitem in item: + try: + int(subitem) + except ValueError as e: + if not e.args: + e.args = ('',) + e.args += ('Invalid format. Use help(plotpoints',) + raise + + def plotpoints(self, points, pointdiameter=4, fill='#000'): + ''' + Plot points onto the canvas + var points = list, where each element is a 2-length list, where [0] is x and [1] is y coordinate + var pointdiameter = int for how wide the plotted point should be, in pixels + ''' + self.verifypoints(points) + + if self.lowestx is None: + xs = [point[0] for point in points] + ys = [point[1] for point in points] + self.lowestx = min(xs) + self.highestx = max(xs) + self.lowesty = min(ys) + self.highesty = max(ys) + del xs + del ys + + self.spanx = abs(self.highestx - self.lowestx) + self.spany = abs(self.highesty - self.lowesty) + if self.spanx == 0: + self.spanx = 1 + if self.spany == 0: + self.spany = 1 + + self.marginx = self.w * self.margin + self.marginy = self.h * self.margin + self.drawablew = self.w - (2 * self.marginx) + self.drawableh = self.h - (2 * self.marginy) + + for point in points: + # Get percentage of the span + x = ((point[0]) - self.lowestx) / self.spanx + y = ((point[1]) - self.lowesty) / self.spany + # Flip y + y = 1 - y + # Use the percentage to get a location on the board + x *= self.drawablew + y *= self.drawableh + # Put into center + x += self.marginx + y += self.marginy + + r = pointdiameter / 2 + self.c.create_oval(x-r, y-r, x+r, y+r, fill=fill) + self.c.update() + #print(point, x, y) + +if __name__ == '__main__': + dp = DataPoint() + points = list(range(100)) + points = [[p, dp.function(p)] for p in points] + dp.plotpoints(points) + dp.mainloop() \ No newline at end of file diff --git a/HerokuBot/Procfile b/HerokuBot/Procfile new file mode 100644 index 0000000..ffcf86c --- /dev/null +++ b/HerokuBot/Procfile @@ -0,0 +1,2 @@ +# Procfile +worker: python herokubot.py \ No newline at end of file diff --git a/HerokuBot/README.md b/HerokuBot/README.md new file mode 100644 index 0000000..0fefca7 --- /dev/null +++ b/HerokuBot/README.md @@ -0,0 +1,75 @@ +Using Heroku to run a bot +============= + +[Thank you /u/cmd-t for helping me to finally understand this](http://www.reddit.com/r/botwatch/comments/34dpku/can_someone_write_a_complete_idiots_guide_to/cqts1tr) + +Inside git.zip is the .git repo that I created for this. I had to zip it so that I can push it here. + +1. Create a [Heroku account](http://heroku.com) +2. Install [Heroku toolbelt](https://toolbelt.heroku.com/) +3. Install [Git](http://git-scm.com/) +4. Create a folder to keep your repo +5. Write your bot +6. Create requirements.txt, and require a version of praw +7. Create runtime.txt, and require a version of Python +8. Create Procfile, and create a worker that will launch your bot. +9. `> heroku login` +10. `> git init` +11. `> git add .` +12. `> git commit -m "1"` +13. `> heroku create` + + Creating aqueous-plains-9797... done, stack is cedar-14 + https://aqueous-plains-9797.herokuapp.com/ | https://git.heroku.com/aqueous-plains-9797.git + Git remote heroku added +14. `> git push heroku master` + + Counting objects: 10, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (7/7), done. + Writing objects: 100% (10/10), 1.06 KiB, done. + Total 10 (delta 1), reused 0 (delta 0) + remote: Compressing source files... done. + remote: Building source: + remote: + remote: -----> Python app detected + remote: -----> Installing runtime (python-3.4.2) + remote: -----> Installing dependencies with pip + remote: Collecting praw>=2.1.21 (from -r requirements.txt (line 1)) + remote: Downloading praw-2.1.21-py2.py3-none-any.whl (75kB) + remote: Collecting requests>=2.3.0 (from praw>=2.1.21->-r requirements.txt (line 1)) + remote: Downloading requests-2.6.2-py2.py3-none-any.whl (470kB) + remote: Collecting update-checker>=0.11 (from praw>=2.1.21->-r requirements.txt (line 1)) + remote: Downloading update_checker-0.11-py2.py3-none-any.whl + remote: Collecting six>=1.4 (from praw>=2.1.21->-r requirements.txt (line 1)) + remote: Downloading six-1.9.0-py2.py3-none-any.whl + remote: Installing collected packages: six, update-checker, requests, praw + remote: + remote: + remote: + remote: + remote: Successfully installed praw-2.1.21 requests-2.6.2 six-1.9.0 update-checker-0.11 + remote: + remote: -----> Discovering process types + remote: Procfile declares types -> worker + remote: + remote: -----> Compressing... done, 38.3MB + remote: -----> Launching... done, v3 + remote: https://aqueous-plains-9797.herokuapp.com/ deployed to Heroku + remote: + remote: Verifying deploy... done. + To https://git.heroku.com/aqueous-plains-9797.git + * [new branch] master -> master +15. `> heroku ps:scale worker=1` + + Scaling dynos... done, now running worker at 1:1X. +16. `> heroku logs > logs.txt` + + 2015-05-01T00:32:38.691805+00:00 app[worker.1]: Logging in. + 2015-05-01T00:32:41.396117+00:00 app[worker.1]: Getting subreddit info. + 2015-05-01T00:32:41.397202+00:00 app[worker.1]: /r/Goldtesting + 2015-05-01T00:32:45.316887+00:00 app[worker.1]: Created at: 1400997940 + 2015-05-01T00:32:45.316897+00:00 app[worker.1]: Subscribers: 17 + 2015-05-01T00:32:45.316900+00:00 app[worker.1]: All done! + +17. Celebrate \ No newline at end of file diff --git a/HerokuBot/git.zip b/HerokuBot/git.zip new file mode 100644 index 0000000000000000000000000000000000000000..36a5d7a0af4ec9074a3853b9355fb98db359a93e GIT binary patch literal 32604 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 literal 0 HcmV?d00001 diff --git a/HerokuBot/herokubot.py b/HerokuBot/herokubot.py new file mode 100644 index 0000000..5f357ac --- /dev/null +++ b/HerokuBot/herokubot.py @@ -0,0 +1,16 @@ +import praw +import time + +print('Logging in.') +r = praw.Reddit('Testing praw api usage over Heroku') +r.login('qQGusVuAHezHxhYTiYGm', 'qQGusVuAHezHxhYTiYGm') + +print('Getting subreddit info.') +sub = r.get_subreddit('Goldtesting') +print('/r/Goldtesting') +print('\tCreated at: %d' % sub.created_utc) +print('\tSubscribers: %d' % sub.subscribers) + +print('All done!') +while True: + time.sleep(60) \ No newline at end of file diff --git a/HerokuBot/requirements.txt b/HerokuBot/requirements.txt new file mode 100644 index 0000000..47c4aa5 --- /dev/null +++ b/HerokuBot/requirements.txt @@ -0,0 +1 @@ +praw >= 2.1.21 \ No newline at end of file diff --git a/HerokuBot/runtime.txt b/HerokuBot/runtime.txt new file mode 100644 index 0000000..1dc44e8 --- /dev/null +++ b/HerokuBot/runtime.txt @@ -0,0 +1 @@ +python-3.4.2 \ No newline at end of file diff --git a/Logogame/images/kagenui.png b/Logogame/images/kagenui.png deleted file mode 100644 index eb69b6217edd9bf813fd0341b9f6d3be37039306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51912 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 diff --git a/Logogame/logos.py b/Logogame/logos.py deleted file mode 100644 index b28b669..0000000 --- a/Logogame/logos.py +++ /dev/null @@ -1,381 +0,0 @@ -import os -import tkinter -import sqlite3 -import hashlib -import string -from PIL import Image -from PIL import ImageTk - -class Generic: - def __init__(self): - pass - def set_dict_attributes(self, attributes): - for attribute in attributes: - setattr(self, attribute, attributes[attribute]) - -class LogoGame: - def __init__(self): - self.WINDOWS_BADCHARS = '\\/?:*"><|' - self.t = tkinter.Tk() - self.t.title('Logogame') - if not os.path.exists('logos.db'): - print('You\'re missing the game\'s logo database!') - print('Cannot proceed!') - quit() - - self.font_main = ('Consolas', 12) - self.font_small = ('Consolas', 8) - self.color_blue = '#0ed' - self.color_green = '#31f13a' - self.color_red = '#e23939' - - self.logos_per_row = 6 - self.logo_padx = 10 - self.logo_pady = 10 - - self.dbindex_id = 0 - self.dbindex_name = 1 - self.dbindex_solutions = 2 - self.dbindex_images = 3 - self.dbindex_tag = 4 - - self.sql = sqlite3.connect('logos.db') - self.cur = self.sql.cursor() - self.stats_main = self.stats_load('stats') - self.playerstats_load(self.stats_main.playername) - - self.tkinter_elements = [] - self.logo_elements = [] - self.tag_elements = [] - self.active_tags = set() - self.all_tags = [] - self.all_logos = [] - self.logos_load() - - self.w = 1062 - self.h = 600 - 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.t.bind('', self.update_wh) - - def start(self): - self.gui_build_main() - self.t.mainloop() - - def logos_load(self): - self.all_logos = [] - self.cur.execute('SELECT * FROM logos') - fetch = self.cur.fetchall() - for item in fetch: - logo = Generic() - logo.id = item[self.dbindex_id] - logo.images = item[self.dbindex_images].split(',') - logo.name = item[self.dbindex_name] - logo.solutions = item[self.dbindex_solutions].split(',') - logo.tags = item[self.dbindex_tag].split(',') - logo.solved = self.playerstats_hassolved(logo.id) - self.all_logos.append(logo) - self.all_tags = self.get_all_tags() - self.all_tags.append('Completed') - - def destroy_all_elements(self): - self.tag_elements = [] - self.destroy_all_logos() - while len(self.tkinter_elements) > 0: - self.tkinter_elements[0].destroy() - del self.tkinter_elements[0] - - def destroy_all_logos(self): - while len(self.logo_elements) > 0: - self.logo_elements[0].destroy() - del self.logo_elements[0] - - def gui_build_main(self, *b): - self.destroy_all_elements() - ### - self.frame_mainmenu = tkinter.Frame(self.t) - self.frame_mainmenu.pack(expand=True, anchor='center') - self.tkinter_elements.append(self.frame_mainmenu) - # - self.button_playgame = tkinter.Button( - self.frame_mainmenu, - text='Play', - #relief='flat', - font=self.font_main, - bg=self.color_green, - activebackground=self.color_green, - command=self.gui_build_game) - self.button_playgame.grid(row=10, column=5) - self.tkinter_elements.append(self.button_playgame) - # - self.label_playername = tkinter.Label( - self.frame_mainmenu, - text='Player name: ', - font=self.font_main) - self.label_playername.grid(row=30, column=4) - self.tkinter_elements.append(self.label_playername) - # - self.entry_playername = tkinter.Entry( - self.frame_mainmenu, - font=self.font_main, - relief='solid', - width=30) - self.entry_playername.bind('', lambda x: self.playername_set(self.entry_playername.get())) - self.entry_playername.insert(0, self.stats_main.playername) - self.entry_playername.grid(row=30, column=5) - self.tkinter_elements.append(self.entry_playername) - # - self.button_playername = tkinter.Button( - self.frame_mainmenu, - text='Set', - font=self.font_small, - #relief='flat', - bg=self.color_blue, - activebackground=self.color_blue, - command=lambda: self.playername_set(self.entry_playername.get())) - self.button_playername.grid(row=30, column=6) - self.tkinter_elements.append(self.button_playername) - # - self.label_playerhash = tkinter.Label( - self.frame_mainmenu, - text=self.sha8(self.stats_main.playername), - font=self.font_main) - self.label_playerhash.grid(row=30, column=7) - self.tkinter_elements.append(self.label_playerhash) - ### - - def gui_build_game(self, *b): - self.destroy_all_elements() - ### - self.frame_gametoolbar = tkinter.Frame(self.t) - self.frame_gametoolbar.pack(fill='x', anchor='n') - self.tkinter_elements.append(self.frame_gametoolbar) - # - self.button_back = tkinter.Button( - self.frame_gametoolbar, - text='X', - font=self.font_main, - bg=self.color_red, - activebackground=self.color_red, - command=self.gui_build_main) - self.button_back.grid(row=0, column=0) - self.tkinter_elements.append(self.button_back) - # - #self.frame_gamearea = tkinter.Frame(self.t, bg='#f00') - #self.frame_gamearea.pack(expand=True, fill='both', anchor='w') - # - self.frame_posttoolbar = tkinter.Frame(self.t) - self.frame_posttoolbar.pack(expand=True, fill='both') - self.tkinter_elements.append(self.frame_posttoolbar) - # - self.frame_gametaglist = tkinter.Frame(self.frame_posttoolbar) - self.frame_gametaglist.pack(expand=True, fill='y', side='left', anchor='w') - self.tkinter_elements.append(self.frame_gametaglist) - # - self.frame_logoarea = tkinter.Frame(self.frame_posttoolbar) - self.frame_logoarea.pack(expand=True, fill='both', anchor='e') - self.tkinter_elements.append(self.frame_logoarea) - # - button_applytag = tkinter.Button(self.frame_gametaglist, text='Apply', command=self.gui_rebuild_game) - button_applytag.grid(row=0, column=0, sticky='w') - # - for i in range(len(self.all_tags)): - tag = self.all_tags[i] - intvar = tkinter.IntVar() - intvar.tag=tag - checkbox = tkinter.Checkbutton(self.frame_gametaglist, text=tag, variable=intvar) - checkbox.intvar = intvar - checkbox.grid(row=i+1, column=0, sticky='w') - intvar.set(1) - self.tkinter_elements.append(checkbox) - self.tag_elements.append(checkbox) - self.active_tags.add(tag) - - self.gui_rebuild_game() - - ### - - def gui_rebuild_game(self, *b): - self.destroy_all_logos() - w = self.t.winfo_width() - h = self.t.winfo_height() - resizemeter = w / 9 - row = 0 - col = 0 - for element in self.tag_elements: - if element.intvar.get() == 1: - self.active_tags.add(element.intvar.tag) - elif element.intvar.tag in self.active_tags: - self.active_tags.remove(element.intvar.tag) - - for logo in self.all_logos: - if not any(tag in self.active_tags for tag in logo.tags): - continue - if logo.solved is True and 'Completed' not in self.active_tags: - continue - logoframe = tkinter.Frame(self.frame_logoarea) - logoframe.pack_propagate(0) - self.logo_elements.append(logoframe) - imageframe = tkinter.Frame(logoframe, width=resizemeter, height=resizemeter) - imageframe.pack_propagate(0) - imageframe.grid(row=0, column=0, sticky='n') - label_image = tkinter.Label(imageframe) - label_image.pack(anchor='center', expand=True, fill='both') - label_name = tkinter.Label(logoframe) - entry_name = tkinter.Entry(logoframe) - if logo.solved is True: - i = self.png_load(logo.images[-1], resizemeter) - label_image.configure(image=i) - label_image.i = i - label_name.configure(text=logo.name) - label_name.grid(row=1, column=0, sticky='s') - else: - i = self.png_load(logo.images[0], resizemeter) - label_image.configure(image=i) - label_image.i = i - entry_name.grid(row=1, column=0, sticky='s') - self.tkinter_elements.append(logoframe) - logoframe.id = logo.id - logoframe.entry_name = entry_name - logoframe.label_name = label_name - logoframe.label_image = label_image - logoframe.grid(row=row, column=col, padx=self.logo_padx, pady=self.logo_pady) - col += 1 - col = col % self.logos_per_row - if col == 0: - row += 1 - - - def gui_build_logo(self, *b): - self.destroy_all_elements() - ### - - def playername_set(self, newname): - if newname == '': - return - if newname != self.stats_main.playername: - self.cur.execute('UPDATE stats SET value=? WHERE key="playername"', [newname]) - self.sql.commit() - playerhash = self.playerstats_load(newname) - self.stats_main.playername = newname - - if self.label_playerhash: - self.label_playerhash.configure(text=playerhash) - for logo in self.all_logos: - logo.solved = self.playerstats_hassolved(logo.id) - print('Name: ' + self.stats_main.playername) - self.clean_empty_dbs() - - def sha8(self, text): - sha = hashlib.sha256() - sha.update(text.encode('utf-8')) - sha = sha.hexdigest() - return sha[:8] - - def png_load(self, filename, resize=None): - if filename[-4:] != '.png': - filename = filename + '.png' - filename = 'images/' + filename - i = Image.open(filename) - if resize: - ratio = resize / max(i.size) - newx = int(i.size[0] * ratio) - newy = int(i.size[1] * ratio) - i = i.resize([newx, newy], resample=Image.ANTIALIAS) - i = ImageTk.PhotoImage(i) - return i - - def stats_load(self, database): - if database == 'stats': - self.cur.execute('SELECT * FROM stats') - fetchall = self.cur.fetchall() - if database == 'player': - self.cur_player.execute('SELECT * FROM stats') - fetchall = self.cur_player.fetchall() - keyvals = {} - for fetched in fetchall: - keyvals[fetched[0]] = fetched[1] - stats = Generic() - stats.set_dict_attributes(keyvals) - return stats - - def playerstats_load(self, playername, presha=False): - if not presha: - sha = self.sha8(playername) - else: - sha = playername - filename = self.strip_to_filename(playername) + '_' + sha - self.sql_player = sqlite3.connect('playerdata/%s.db' % filename) - self.cur_player = self.sql_player.cursor() - self.cur_player.execute('CREATE TABLE IF NOT EXISTS stats(key TEXT, value TEXT)') - self.sql_player.commit() - return sha - - def playerstats_set(self, key, value): - self.cur_player.execute('SELECT * FROM stats WHERE key=?', [key]) - if cur.fetchone(): - self.cur_player.execute('UPDATE stats SET value=? WHERE key=?', [value, key]) - else: - self.cur_player.execute('INSERT INTO stats VALUES(?, ?)', [key, value]) - self.sql_player.commit() - - def playerstats_get(self, key): - self.cur_player.execute('SELECT * FROM stats WHERE key=?', [key]) - f = self.cur_player.fetchone() - if f: - return f[1] - return None - - def playerstats_hassolved(self, logoid): - key = 'hassolved_%d' % logoid - val = self.playerstats_get(key) - if val is None: - return False - return True - - def strip_to_filename(self, s): - for badchar in self.WINDOWS_BADCHARS: - s = s.replace(badchar, '') - return s - - def get_all_tags(self): - self.cur.execute('SELECT * FROM logos') - fetch = self.cur.fetchall() - alltags = [] - for item in fetch: - itemtags = item[self.dbindex_tag] - itemtags = itemtags.replace(', ', ',') - itemtags = itemtags.split(',') - alltags += itemtags - alltags = list(set(alltags)) - alltags.sort() - return alltags - - def clean_empty_dbs(self): - ls = os.listdir('playerdata') - todelete = [] - for name in ls: - name = 'playerdata/'+name - s = sqlite3.connect(name) - c = s.cursor() - c.execute('SELECT * FROM stats') - if not c.fetchone(): - del c - del s - try: - os.remove(name) - except PermissionError: - pass - - -if __name__ == '__main__': - logogame = LogoGame() - logogame.start() \ No newline at end of file diff --git a/TKdraw/tkdraw.py b/TKdraw/tkdraw.py new file mode 100644 index 0000000..4648ab8 --- /dev/null +++ b/TKdraw/tkdraw.py @@ -0,0 +1,59 @@ +import tkinter + +class TKDraw(): + def __init__(self): + self.windowtitle = 'Tkdraw' + + self.ismousedown = False + self.minwidth = 1 + self.maxwidth = 5 + + self.t = tkinter.Tk() + self.t.title(self.windowtitle) + self.w = 450 + self.h = 350 + 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.canvas = tkinter.Canvas(self.t, bg='#000') + self.canvas.pack(expand=True, fill='both') + #print(help(self.canvas.bind)) + self.canvas.bind('', self.mousedown) + self.canvas.bind('', self.mouseup) + self.canvas.bind('', self.mousedraw) + self.prevx = None + self.prevy = None + + def mainloop(self): + self.t.mainloop() + + def mousedown(self, *b): + self.ismousedown = True + + def mouseup(self, *b): + self.ismousedown = False + self.prevx = None + self.prevy = None + + def mousedraw(self, event): + if self.ismousedown is False: + return + x = event.x + y = event.y + if self.prevx is not None: + distance = ((self.prevx - x)**2) + ((self.prevy - y) ** 2) + distance = distance ** 0.5 + distance = max(self.minwidth, distance) + distance = min(self.maxwidth, distance) + self.canvas.create_line(self.prevx, self.prevy, x, y, width=distance, fill='#fff') + self.prevx = x + self.prevy = y + +tkd = TKDraw() +tkd.mainloop() \ No newline at end of file