Search code examples
pythonpython-3.xbuttontkintermessagebox

Creating a UI for Python Program using tkinter. The button in Tkinter can be pressed multiple times. How can I create a "One Process" Pop Up?


Here is the simple UI with my attempt for this...

import tkinter as ttk
import subprocess
import sys
import time
import os
import tkinter.font as font
from tkinter import messagebox
from tkinter.ttk import *

app = ttk.Tk()

app.geometry("400x400")
app.configure(bg='gray')

photo = ttk.PhotoImage(file=r"C:\Users\ex\ex_button_active.png")
myFont = font.Font(family='Helvetica', size=20, weight='normal')

ttk.Label(app, text='Ex', bg='gray', font=(
    'Verdana', 15)).pack(side=ttk.TOP, pady=10)
app.iconbitmap(r'C:\Users\ex\ex_icon.ico')


def ex_activation():
    global pro
    print("Running program!")
    pro = subprocess.Popen("python programex.py", shell=True)


def ex_stop():
    global pro
    print("Stopping Program... Please Wait!")
    os.kill(pro.pid, 0)


ex_activation_button = ttk.Button(app, bg='black', image=photo, width=120, height=120, command=ex_activation)
ex_activation_button += 1
if ex_activation_button < 1:
    messagebox.showinfo("showinfo", "In Order to Run Again, Press ""Stop Program""")

ex_stop_button = ttk.Button(app, bg='Gray', text='Stop Program', width=12, command=ex_stop, height=3)

ex_stop_button['font'] = myFont

app.title("Ex")
ex_activation_button.pack(side=ttk.TOP)
ex_stop_button.pack(side=ttk.LEFT)

# app.mainloop()
while True:
    try:
        app.update()
        app.update_idletasks()
    except KeyboardInterrupt:
        pass

The goal here is to add a "One Process Only" Warning when the button is clicked more than once. The real question is how would I reset this counter for the number of times the start button was clicked after the stop button is clicked. This is a looping program and that is the reason I have a stop button. Any help greatly appreciated!


Solution

  • You can disable the button by change it's state. After disabled, the button cannot be clicked.

    # disable a button:
    ex_activation_button['state'] = 'disabled'
    
    # re-enable the button:
    ex_activation_button['state'] = 'normal'
    
    
    
    # here is the change you need to add:
    def ex_activation():
        global pro
        print("Running program!")
        ex_activation_button['state'] = 'disabled'
        pro = subprocess.Popen("python programex.py", shell=True)
    
    def ex_stop():
        global pro
        print("Stopping Program... Please Wait!")
        os.kill(pro.pid, 0)
        ex_activation_button['state'] = 'normal'