Python Forum
[Tkinter] Using Tkinter to calculate while formula
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Tkinter] Using Tkinter to calculate while formula
#1
Hello all,

I'm trying to create a simple GUI interface with tkinter using a simple strokes calculator based on an user input. My simple code is below, but I cannot discover how to plot this on the tkinter interface. Could you guys help me on that?

from time import sleep

a = int(input('What is the total Drillstring SPM:'))
stroke_rate = a # strokes/min
stroke_sec = (round((stroke_rate / 60), 2))
stroke_count = 0
run = True

while run == True:
    stroke_count += stroke_sec
    print(str(stroke_count) +' STROKES')
    sleep(1)
And this was what I tried, but did not work:

from tkinter import *
from time import sleep
root = Tk()
root.title("Strokes Counter")
root.resizable(False, False)

def click_button():
    stroke_rate = ed1.get()
    stroke_count = 0
    run = True    
    while run == True:
        stroke_count += stroke_rate
        sleep(1)
        
    lb2 = Label(root, print(str(stroke_count) +' stk'))
    lb2.grid(row=3, column=0)


lb1 = Label(root, text="What is the SPM: ")
lb1.grid(row=0, column=0)

ed1 = Entry(root)
ed1.grid(row=0, column=1)

bt1 = Button(root, text="Confirm", command=click_button)
bt1.grid(row=2, column=0)

root.geometry("300x100")
root.mainloop()
Thanks in advance, guys!
Reply
#2
Tkinter does not process events unless it is running imainloop(). You are blocking mainloop when you do this:
    while run == True:
        stroke_count += stroke_rate
        sleep(1)
If you want your tkinter program to do something every second you should look at .after()

And this is bad:
    lb2 = Label(root, print(str(stroke_count) +' stk'))
    lb2.grid(row=3, column=0)
Update the label text. Don't make another label.
Reply
#3
see Namespace flooding with * imports

Here are the beginnings of turning your code into GUI code.
import tkinter as tk


class MainFrame(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.after_id = None
        self.stroke_count = 0
        self.stroke_sec = 0
        label = tk.Label(self, text="What is the SPM: ")
        label.grid(row=0, column=0)
        self.stroke_rate_entry = tk.Entry(self)
        self.stroke_rate_entry.grid(row=0, column=1)
        self.button = tk.Button(self, text="Start", command=self.on_btn)
        self.button.grid(row=2, column=0)
        self.stroke_amount_label = tk.Label(self, text="0 stk")
        self.stroke_amount_label.grid(row=3, column=0)

    def on_btn(self):
        if self.after_id:
            self.after_cancel(self.after_id)
            self.after_id = None
            self.button.config(text="Start")
            self.stroke_rate_entry.config(state="normal")
            self.stroke_count = 0
            return
        stroke_rate = int(self.stroke_rate_entry.get())
        self.stroke_sec = round((stroke_rate / 60), 2)
        self.button.config(text="Stop")
        self.stroke_rate_entry.config(state="disabled")
        self.update_stroke()

    def update_stroke(self):
        self.stroke_count += self.stroke_sec
        self.stroke_amount_label.config(text=f"{self.stroke_count} stk")
        self.after_id = self.after(1000, self.update_stroke)


def main():
    app = tk.Tk()
    app.title("Strokes Counter")
    app.resizable(False, False)
    app.geometry("300x100")
    main_frame = MainFrame(app)
    main_frame.pack()
    app.mainloop()


if __name__ == "__main__":
    main()
marlonsmachado likes this post
Reply
#4
Yoriz, I would like to thank you for your help. Really helped me!
Thank you again!
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020