Python Forum
[Tkinter] [split] [split] How to make a window stay on top - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: GUI (https://python-forum.io/forum-10.html)
+--- Thread: [Tkinter] [split] [split] How to make a window stay on top (/thread-33419.html)

Pages: 1 2


[split] [split] How to make a window stay on top - knoxvilles_joker - Apr-23-2021

Is there a trick to ensure that each popup window always stays on top, or do I have to click on each popup window to make it the active window?


RE: [split] [split] How to make a window stay on top - BashBedlam - Apr-24-2021

Does this answer your question?

from tkinter import Tk, Toplevel, Button, Label 

def open_a_toplevel_window (title_number: int) :
	this_windows_title = f'Toplevel Window Number {title_number}'
	toplevel_window = Toplevel (root)
	toplevel_window.title (this_windows_title)
	x = root.winfo_x () + title_number * 30
	y = root.winfo_y () + title_number * 10 
	toplevel_window.geometry (f'270x100+{x}+{y}')
	label = Label(toplevel_window, text = this_windows_title)
	button1 = Button(toplevel_window, text = "open next window")
	n = title_number + 1
	button1.config (command = lambda n = n: open_a_toplevel_window (n))
	button2 = Button (toplevel_window, text = "Exit")
	button2.config (command = toplevel_window.destroy)
	label.pack()
	button1.pack()
	button2.pack()
	toplevel_window.attributes ('-topmost', True)
	toplevel_window.mainloop()

n = 1
root = Tk ()
root.title ("Root Window")  
root.geometry ("400x200")  
label1 = Label (root, text = "This is the Root Window")
button = Button (root, text = "Open Toplevel Windows")
button.config (command = lambda n = n: open_a_toplevel_window (n))
label1.pack ()
button.place (x = 110, y = 50)
root.mainloop ()



RE: [split] [split] How to make a window stay on top - knoxvilles_joker - Apr-24-2021

Actually when I click the initial open next window the spawned window does not become active until I click open next window.

Which is the issue I was noticing when I tried to use -topmost true option.

The kicker is I am trying to ensure the window spawned is automatically active and at the top so that it will accept keyboard input.

The question I have to wonder is this a Windows 10 problem, or is it a tkinter problem, or is it a python problem.

The example is rather inspired.

So on my main script I launch it. Splash screen does its thing then it goes to the select screen as I call it. I then hit spacebar to go to the fire screen as I call it. I have to click the fire screen to make it active before I can hit key, "f" to get the firing logic to start applying.

The majority of users are going to be windows users, some Linux, and many Raspbian users along with a few macOS users. So I think this quirk is something I might want to address to keep the script more user friendly.

The flash software I am replacing did not have this issue so I am more leaning that it is an issue with the way I am coding things or it could be the way windows desktop manager is misbehaving or behaving depending upon ones point of view...


RE: [split] [split] How to make a window stay on top - BashBedlam - Apr-25-2021

In this example, the text_entry widget is set to have focus as soon as the toplevel window opens. Is this what you're looking for?

from tkinter import Tk, Toplevel, Button, Label, Text
 
def open_a_toplevel_window () :
	toplevel_window = Toplevel (root)
	toplevel_window.title ('Focusing on Text Entery')
	toplevel_window.geometry ('270x100')
	label = Label(toplevel_window, text = 'Enter Text Now')
	label.pack()
	text_entry = Text (toplevel_window, width = 10, height = 3)
	text_entry.focus_set ()
	text_entry.pack ()
	toplevel_window.attributes ('-topmost', True)
	toplevel_window.mainloop()
 
root = Tk ()
root.title ("Root Window")  
root.geometry ("400x200")  
label1 = Label (root, text = "This is the Root Window")
button = Button (root, text = "Open Toplevel Window")
button.config (command = open_a_toplevel_window)
label1.pack ()
button.place (x = 110, y = 50)
root.mainloop ()



RE: [split] [split] How to make a window stay on top - knoxvilles_joker - Apr-25-2021

(Apr-25-2021, 01:59 AM)BashBedlam Wrote: In this example, the text_entry widget is set to have focus as soon as the toplevel window opens. Is this what you're looking for?

from tkinter import Tk, Toplevel, Button, Label, Text
 
def open_a_toplevel_window () :
	toplevel_window = Toplevel (root)
	toplevel_window.title ('Focusing on Text Entery')
	toplevel_window.geometry ('270x100')
	label = Label(toplevel_window, text = 'Enter Text Now')
	label.pack()
	text_entry = Text (toplevel_window, width = 10, height = 3)
	text_entry.focus_set ()
	text_entry.pack ()
	toplevel_window.attributes ('-topmost', True)
	toplevel_window.mainloop()
 
root = Tk ()
root.title ("Root Window")  
root.geometry ("400x200")  
label1 = Label (root, text = "This is the Root Window")
button = Button (root, text = "Open Toplevel Window")
button.config (command = open_a_toplevel_window)
label1.pack ()
button.place (x = 110, y = 50)
root.mainloop ()

That is playing more nicely. Many thanks.


RE: [split] [split] How to make a window stay on top - knoxvilles_joker - Apr-25-2021

Is there a good way to get a destroy mechanism used and a splashscreen of sorts for a loading screen used? I am still playing through things but it is proving to be a vexing problem.


RE: [split] [split] How to make a window stay on top - knoxvilles_joker - Apr-25-2021

The other question is can this be done with a class based setup, or does this have to stay as a function based setup in order for the calls to properly work with a window attribute of -topmost?

I found when using my existing main script the topmost attribute did not appear to make the popup window a topmost window.

Your code works, the only kicker is I am needing a splash screen to come up then disappear.

Though you did post a solution, it kind of does what I need, but, is there a way to do a popup window that automatically closes after x seconds with this particular type of structuring?

Given things should I just post that on a separate thread is the other question as you technically answered, but it was not an answer that completely worked for me from the get go.


RE: [split] [split] How to make a window stay on top - knoxvilles_joker - Apr-25-2021

I did more digging on this and the solution is to add this to the window frame declarations:
focus_force()
I added also focus_set() but that did not help

I add that to my original code and it appears to work as seen here

import tkinter as tk
from tkinter import *
#import PIL.ImageTk
#import image
#import PIL
#import PIL.Image
import tkinter.ttk as ttk
import datetime as dt
import time
import os
from tkinter import messagebox
from collections import deque
from itertools import islice
from threading import Thread
from playsound import playsound

#
# global variables will be declared here
GUN = ""

# sets ammo count to initial value of 500 
INITIAL_COUNTER_VALUE = 500
# sets initial time at 100%
INITIAL_TIMER_VALUE = 33000 
# sets initial gun terminal ID
#sets gun rate
RMMAX = 0
# sets initial temparature
TEMP_INITIAL = 20
# sets text string for ammo/temp/low ammo status button
STATUS = ""

COOLED = 20

# end global variables section
#
# This is the initial screen that loads and then disappears after 8 seconds 
# I used 3 images to make the main deal.  The issue was that pygame allowed for line draws
# tkinter only allows for drawing of boxes.  
# should this change I will change from using images.


# this defines the splash frame 
class SplashFrame(tk.Toplevel):
    def __init__(splash, *args, **kwargs):
        super().__init__(*args, **kwargs)
        splash.geometry('512x256')
        splash.title("Inititaling")
        splash.configure(background='black')
        splash.overrideredirect(True)
        splash.after(3000, splash.destroy)
        splash.focus_set()
        splash.focus_force()
        tk.Grid.rowconfigure(splash, 0, weight=1, uniform='a')
        tk.Grid.rowconfigure(splash, 1, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 2, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 3, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 4, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 5, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 6, weight=1, uniform='b')

        tk.Grid.columnconfigure(splash, 0, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 1, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 2, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 3, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 4, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 5, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 6, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 7, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 8, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 9, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 10, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 11, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 12, weight=1, uniform='d')
        styled = ttk.Style()
#('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
        styled.theme_use('default')
        styled.configure("TLabel", background='black', darkcolor='black', bordercolor='black', relief='none', lightcolor='black', highlightcolor='black', throughcolor='black', foreground='black', shiftrelief=-5, highlightthickness=0, width=0, anchor="NSEW")
        styled.configure("Horizontal.TProgressbar", foreground = 'black', background = 'yellow', bordercolor='black', darkcolor='black', throughcolor='black', lightcolor='black')
        loadingbar = ttk.Progressbar(splash, style="Horizontal.TProgressbar", orient="horizontal", length = 50, mode='indeterminate', maximum=100)
        loadingbar.grid(row=4, column=4, columnspan=2, sticky="NEW")
        loadingbar.start([48])
        tk.Label(splash, text="SYSTEM INITIALIZING", bg='black', fg='yellow', font="sentryTerminalfi 6").grid(row=3, column=4, columnspan=2, sticky="SEW")
        tk.Button(splash, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', highlightthickness=0, bd=0, borderwidth=0, justify=tk.CENTER, text="UA 571-C \n REMOTE SENTRY WEAPON SYSTEM", font="sentryTerminalfi 12").grid(row=2, column=2, columnspan=6, sticky="NEWS")        
        splash.canvas = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvas.create_line(5,5,50,5, fill='yellow')
        splash.canvas.create_line(5,5,5,50, fill='yellow')
        splash.canvas.grid(row=0, column=0, rowspan=2, columnspan=2) 

        splash.canvasright = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvasright.create_line(5,5,45,5, fill='yellow')
        splash.canvasright.create_line(45,5,45,45, fill='yellow')
        splash.canvasright.grid(row=0, column=11, rowspan=2, columnspan=2) 

        splash.canvasbotright = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvasbotright.create_line(5,45,45,45, fill='yellow')
        splash.canvasbotright.create_line(45,5,45,45, fill='yellow')
        splash.canvasbotright.create_text(22,27, fill='yellow', text="  28R \n LM 12", justify=tk.RIGHT, font="sentryTerminalfi 8")
        splash.canvasbotright.grid(row=5, column=11, rowspan=2, columnspan=2) 

        splash.canvasbotleft = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvasbotleft.create_line(5,45,45,45, fill='yellow')
        splash.canvasbotleft.create_line(5,5,5,45, fill='yellow')
        splash.canvasbotleft.create_text(25, 35, text="V5.48", fill='yellow', font="sentryTerminalfi 6")
        splash.canvasbotleft.grid(row=5, column=0, rowspan=2, columnspan=2) 

#
# End of splash screen defined class and related functions
#




#------------begin select screen------------------------------
# Begin select menu defined class and related functions
# This is the script's core window so more code will be present here than in other sections
#  
# This is the next screen to load after the initial splash screen
class TkApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('512x256')
        self.title("Select Screen")
        self.configure(bg='black') 
        self.gun = tk.StringVar()
        self.gun.set(GUN)
        self.focus_set()
        self.focus_force()
        # Specify Grid 
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.rowconfigure(self, 1, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 2, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 3, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 4, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 5, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 6, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 7, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 8, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 9, weight=1, uniform='b')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 1, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 2, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 3, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 4, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 5, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 6, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 7, weight=1, uniform='d')


        button_1 = tk.Button(self, justify=tk.CENTER, text="AUTO-REMOTE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        button_2 = tk.Button(self, justify=tk.CENTER, text="HARD", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        button_3 = tk.Button(self, justify=tk.CENTER, text="SEMIHARD", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        button_4 = tk.Button(self, justify=tk.CENTER, text="SOFT", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        sbutton_1 = tk.Button(self, justify=tk.CENTER, text="BIO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        sbutton_2 = tk.Button(self, justify=tk.CENTER, text="INERT", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        tsbutton_1 = tk.Button(self, justify=tk.CENTER, text="MULTI SPEC", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        tsbutton_2 = tk.Button(self, justify=tk.CENTER, text="INFRA RED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        tsbutton_3 = tk.Button(self, justify=tk.CENTER, text="UV", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        wsbutton_1 = tk.Button(self, justify=tk.CENTER, text="SAFE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        wsbutton_2 = tk.Button(self, justify=tk.CENTER, text="ARMED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_1 = tk.Button(self, justify=tk.CENTER, text="SEARCH", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_2 = tk.Button(self, justify=tk.CENTER, text="TEST", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_3 = tk.Button(self, justify=tk.CENTER, text="ENGAGED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_4 = tk.Button(self, justify=tk.CENTER, text="INTERROGATE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        trbutton_1 = tk.Button(self, justify=tk.CENTER, text="AUTO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        trbutton_2 = tk.Button(self, justify=tk.CENTER, text="SELECTIVE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        smman = tk.Button(self, justify=tk.CENTER, text="MAN-OVERRIDE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        smauto = tk.Button(self, justify=tk.CENTER, text="SEMI-AUTO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        # displays gun id on top left and right of screen
        gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        self.canvasgun1 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun1.grid(row=0, column=0)
        self.canvasgun1.create_oval(0,0,27,27,outline='yellow')

        which_gun = self.gun.get()
        
        self.gun.set(which_gun) 
       # self.canvasgun1['text'] = 'which_gun'
      #  self.canvasgun1.create_text(10, 10, fill='yellow', text='which_gun')        
        self.canvasgun1.itemconfigure(self.gun, text=which_gun, fill='yellow', disabledfill='yellow')
        self.canvasgun1.create_window(28, 28, window=gun_1)
        gun_2 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun)
        headernew = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=0, justify=CENTER, text="UA         571-C \n REMOTE SENTRY WEAPON SYSTEM")
        syst = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="SYSTEM MODE")
        weap = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="WEAPON STATUS")
        iff = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="IFF STATUS")
        test = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TEST ROUTINE")
        target = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TARGET PROFILE")
        spectral = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="SPECTRAL PROFILE")
        ts = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TARGET SELECT")
        gun_1.grid(row=0, column=0, sticky=W)
        gun_2.grid(row=0, column=7, ipadx=2, ipady=2, padx=2, pady=2, sticky=E)
        headernew.grid(row=0, column=1, columnspan=6, sticky="NSEW")
        button_1.grid(row=2, column=0, columnspan=2, sticky="NSEW")
        button_2.grid(row=9, column=0, columnspan=3, sticky="NSEW")
        button_3.grid(row=8, column=0, columnspan=3, sticky="NSEW")
        button_4.grid(row=7, column=0, columnspan=3, sticky="NSEW")
        sbutton_1.grid(row=7, column=3, columnspan=2, sticky="NSEW")
        sbutton_2.grid(row=8, column=3, columnspan=2, sticky="NSEW")
        tsbutton_1.grid(row=7, column=5, columnspan=3, sticky="NSEW")
        tsbutton_2.grid(row=8, column=5, columnspan=3, sticky="NSEW")
        tsbutton_3.grid(row=9, column=5, columnspan=3, sticky="NSEW")
        wsbutton_1.grid(row=2, column=2, columnspan=2, sticky="NSEW")
        wsbutton_2.grid(row=3, column=2, columnspan=2, sticky="NSEW")
        isbutton_1.grid(row=2, column=4, columnspan=2, sticky="NSEW")
        isbutton_2.grid(row=3, column=4, columnspan=2, sticky="NSEW")
        isbutton_3.grid(row=4, column=4, columnspan=2, sticky="NSEW")
        isbutton_4.grid(row=5, column=4, columnspan=2, sticky="NSEW")
        trbutton_1.grid(row=2, column=6, columnspan=2, sticky="NSEW")
        trbutton_2.grid(row=3, column=6, columnspan=2, sticky="NSEW")
        smman.grid(row=3, column=0, columnspan=2, sticky="NSEW")
        smauto.grid(row=4, column=0, columnspan=2, sticky="NSEW") 
        syst.grid(row=1, column=0, columnspan=2, sticky="NSEW")
        weap.grid(row=1, column=2, columnspan=2, sticky="NSEW")
        iff.grid(row=1, column=4, columnspan=2, sticky="NSEW")
        test.grid(row=1, column=6, columnspan=2, sticky="NSEW")
        target.grid(row=6, column=0, columnspan=3, sticky="NSEW")
        spectral.grid(row=6, column=3, columnspan=2, sticky="NSEW")
        ts.grid(row=6, column=5, columnspan=3, sticky="NSEW")
        # this quits by clicking a button labeled q
        quit = tk.Button(self, bg='black', fg='yellow', text='q', command=self.quit)
        quit.grid(row=8,column=0,sticky="SW")
        self.bind('<KeyPress-Down>', self.on_down)
        self.bind("<Up>", self.on_up)
        self.bind("<Left>", self.on_left)
        self.bind("<Right>", self.on_right)
        self.bind("<KeyPress-a>", self.on_keypress_a)
        self.bind("<KeyPress-b>", self.on_keypress_b)
        self.bind("<KeyPress-c>", self.on_keypress_c)
        self.bind("<KeyPress-d>", self.on_keypress_d)
        self.bind("<KeyPress-q>", self.on_keypress_q)
        tk.Button(self, text='SecondFrame', command=self.on_button, bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow').grid(row=9, column=0, sticky="SW")
        self.create_splashframe()
        # These are the bind key definitions
        self.bind("<KeyPress-r>", self.on_keypress_r)
        self.bind("<KeyPress-space>", self.on_keypress_space)
        self.bind("<KeyPress-k>", self.on_keypress_k)
        self.group1 = deque((button_1, smman, smauto))
        self.group2 = deque((wsbutton_1, wsbutton_2))
        self.group3 = deque((isbutton_1, isbutton_2, isbutton_3, isbutton_4))
        self.group4 = deque((trbutton_1, trbutton_2))
        self.group5 = deque((button_4, button_3, button_2))
        self.group6 = deque((sbutton_1, sbutton_2))
        self.group7 = deque((tsbutton_1, tsbutton_2, tsbutton_3))
        self.header_group = deque(((syst, self.group1), (weap, self.group2),(iff, self.group3), (test, self.group4),(target, self.group5), (spectral, self.group6),(ts, self.group7)))
        self.start_with_first_selected(False)
        self.toggle_header_group(self.header_group) 
 
    def toggle_button_group(self, button_group):
        button_group[0].config(foreground='black', background='yellow', relief='sunken')
        for button in islice(button_group, 1, None):
            button.config(foreground='yellow', background='black', relief='raised')
 
 
    def toggle_header_group(self, header_group):
        header_group[0][0].config(disabledforeground='black', background='yellow', relief='sunken')
        for button in islice(self.header_group, 1, None): 
            button[0].config(disabledforeground='yellow',background='black', relief='raised')
 
 
    def start_with_first_selected(self, first_selected=False):
        if first_selected:
           toggle_button_group(self.group1)
           toggle_button_group(self.group2)
           toggle_button_group(self.group3)
           toggle_button_group(self.group4)
           toggle_button_group(self.group5)
           toggle_button_group(self.group6)
           toggle_button_group(self.group7)
        else:
        # set last of each group to selected
           self.group1.rotate(1)
           self.group2.rotate(1)
           self.group3.rotate(1)
           self.group4.rotate(1)
           self.group5.rotate(1)
           self.group6.rotate(1)
           self.group7.rotate(1)
        

 
    def on_down(self, evet):
       group = self.header_group[0][1]
       group.rotate(-1)
       self.toggle_button_group(group)
       playsound("click1.mp3")
  
    def on_up(self, evet):
       group = self.header_group[0][1]
       group.rotate(1)
       self.toggle_button_group(group)
       playsound("click1.mp3")
 
    def on_left(self, evet):
       self.header_group.rotate(1)
       self.toggle_header_group(self.header_group)
       playsound("click1.mp3")
  
    def on_right(self, evet):
       self.header_group.rotate(-1)
       self.toggle_header_group(self.header_group)
       playsound("click1.mp3")





 # this appears to launch the initial window
    def create_splashframe(self):
        splashframe = SplashFrame(self)
        self.withdraw()
        self.wait_window(splashframe)
        self.deiconify()
# this launches the next screen, the fire select screen 
    def on_button(self):
        secondframe = SecondFrame(self)
        self.withdraw()
        self.wait_window(secondframe)
        self.deiconify()

    def kudos(self):
        kudosframe = KudosFrame(self)
        self.withdraw()
        self.wait_window(kudosframe)
        self.deiconify()

    def on_keypress_k(self, evet):
        print("k pressed")
        self.kudos()
        playsound("click1.mp3")
    # these work
    def on_keypress_a(self, evet):
        which_gun = self.gun.get()
        which_gun = "A"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_b(self, evet):
        which_gun = self.gun.get()
        which_gun = "B"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_c(self, evet):
        which_gun = self.gun.get()
        which_gun = "C"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_d(self, evet):
        which_gun = self.gun.get()
        which_gun = "D"
        self.gun.set(which_gun) 
        playsound("click1.mp3")

# this launches you to window three, the fire select window
    def on_keypress_space(self, evet):
        print("space pressed")
        self.on_button()
        playsound("click1.mp3")
# this quits and closes the window by hitting a single key
    def on_keypress_q(self, evet):
        self.quit()
        playsound("click1.mp3")
# this reloads the game, you have to click it to make it the active window again
    def on_keypress_r(self, evet):
        self.destroy()
        self.__init__()
        playsound("click1.mp3")



#
#
#
#
# this is the third fire screen
class SecondFrame(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('512x256')
        self.configure(bg='black')
        self.title("Fire status screen")
        self.focus_set()
        self.focus_force()
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='a')
        tk.Button(self, text='Close', command=self.destroy, bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow').grid(row=8, column=1, sticky="NSEW")
         # locally initialize ammo count down
        self.counter = tk.IntVar()
        self.counter.set(INITIAL_COUNTER_VALUE)
        # locally sets the timer count down at 100%
        self.timer = tk.IntVar()
        self.timer.set(INITIAL_TIMER_VALUE)
        # locally sets rmbar to 0%
        self.rmcount = tk.IntVar()
        self.rmcount.set(RMMAX)
        # locally sets tempbar
        self.temperature = tk.IntVar()
        self.temperature.set(TEMP_INITIAL) 
        # locally sets text string for ammo status button
        self.stat = tk.StringVar()
        self.stat.set(STATUS)
        #
        self.cooldown = tk.IntVar()
        self.stat.set(COOLED)

        self.gun = tk.StringVar()
        self.gun.set(GUN)

        # this arranges the grid row and column groupings.  
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='c')
        tk.Grid.rowconfigure(self, 1, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 2, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 3, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 4, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 5, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 6, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 7, weight=1, uniform='b')
        tk.Grid.rowconfigure(self, 8, weight=1, uniform='b')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 1, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 2, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 3, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 4, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 5, weight=1, uniform='a')
        styled = ttk.Style()
        styled.theme_use('default')
        styled.configure("Vertical.TProgressbar", foreground = 'black', background = 'yellow', bordercolor='black', darkcolor='black', throughcolor='black', lightcolor='black')
        # these are the button and label declarations
        rounds = tk.Label(self, justify=tk.CENTER, textvariable=self.counter)
        rounds.grid(row=3, column=2, columnspan=1, sticky="EW")
        label1 = tk.Label(self, textvariable=self.timer)
        label1.grid(row=7, column=2, sticky="EW")

        temp = tk.Button(self,justify=tk.CENTER,text="Temp",bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow')
        temp.grid(row=2,column=4,sticky="NSEW")

        rm = tk.Button(self,justify=tk.CENTER,text="R(M)",bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow')
        rm.grid(row=2,column=5,sticky="NSEW")
        # rounds rate bar
        rmbar = ttk.Progressbar(self, orient="vertical", variable=self.rmcount)
        rmbar.grid(row=3,column=5,rowspan=6, sticky="NS")

        # temperature bar
        tempbar = ttk.Progressbar(self, orient="vertical", variable=self.temperature)
        tempbar.grid(row=3,column=4,rowspan=6,sticky="NS")

        # declarative buttons
        timestat = tk.Button(self,bg='black',state=tk.DISABLED, fg='yellow',disabledforeground='yellow',highlightbackground='yellow',borderwidth=2,justify=tk.CENTER,text="TIME AT 100% \n (msecs)")
        timestat.grid(row=7,column=0,columnspan=2,sticky="NSEW")
        roundsr = tk.Button(self,bg='black',state=tk.DISABLED, fg='yellow',disabledforeground='yellow',highlightbackground='yellow',borderwidth=2,justify=tk.CENTER,text="Rounds \n Remaining")
        roundsr.grid(row=3,column=0,columnspan=2,sticky="NS")

 # crit menu bar
        crit = tk.Button(self,justify=tk.CENTER,textvariable=self.stat, bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow')
        crit.grid(row=5,column=0,columnspan=2,sticky="NSEW")   
        

        # static center header
        headernew = tk.Button(self, bg='black',state=tk.DISABLED,justify=tk.CENTER, text="UA 571-C \n REMOTE SENTRY WEAPON SYSTEM", borderwidth=0, fg='yellow', disabledforeground='yellow')
        headernew.grid(row=0,column=1,columnspan=4,rowspan=2,sticky="NSEW")




        # displays gun id on top left and right of screen
        gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        gun_1.grid(row=0,column=0,rowspan=2,sticky="NS")
        gun_2 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun)
        gun_2.grid(row=0,column=5,rowspan=2,sticky="NS")


        # this quits by clicking a button labeled q
        quit = tk.Button(self, bg='black', fg='yellow', text='q', command=self.quit)
        quit.grid(row=8,column=0,sticky="SW")

        # these are the attachments for input from keyboard into the application
        # These are the button inputs from the original flash app that were used
        # I added a q as well to quit and close window in case there was a need to close

        self.bind("<KeyPress-f>", self.on_keypress_f)
        self.bind("<KeyRelease-f>", self.on_keyrelease_f)
        self.bind("<KeyPress-a>", self.on_keypress_a)
        self.bind("<KeyPress-b>", self.on_keypress_b)
        self.bind("<KeyPress-c>", self.on_keypress_c)
        self.bind("<KeyPress-d>", self.on_keypress_d)
        # These are the bind key definitions
        self.bind("<KeyPress-r>", self.on_keypress_r)
        self.bind("<KeyPress-q>", self.on_keypress_q)
        self.bind("<KeyPress-space>", self.on_keypress_space)
        self.bind("<KeyPress-k>", self.on_keypress_k)
        
    def coolbar(self):
        temperature_count = self.temperature.get()
        if temperature_count >= 21:
          temperature_count = self.temperature.get()
          temperature_count = temperature_count-1 or TEMP_INITIAL      
          self.temperature.set(temperature_count)
          self.after(300, self.coolbar)

    def overheat(self):
        rmcount_count = self.rmcount.get()
        rmcount_count = 0
        self.rmcount.set(rmcount_count)
        state_stat = self.stat.get()
        state_stat = "OVERHEAT"
        self.stat.set(state_stat)
        playsound("warning1.mp3")

    def critical(self):
        counter_value = self.counter.get()
        if counter_value <= 50:
          counter_value = self.counter.get()
          state_stat = self.stat.get()
          state_stat = "CRITICAL"
          self.stat.set(state_stat)
          playsound("warning1.mp3")
          counter_value = self.counter.get()         

    def out(self):
        counter_value = self.counter.get()
        if counter_value == 1:
          state_stat = self.stat.get()
          state_stat = "OUT"
          self.stat.set(state_stat)
          playsound("warning1.mp3")
          counter_value = self.counter.get()

    def reload(self):
        counter_value = self.counter.get()
        if counter_value >= 1:
          state_stat = self.stat.get()
          state_stat = ""
          self.stat.set(state_stat)
          counter_value = self.counter.get()

    # this defines the fire ammo count down sequence and resets 
    def on_keypress_f(self, evet):        
        counter_value = self.counter.get()
        counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
        self.counter.set(counter_value)
        counter_value = self.counter.get()
        # this is logic to try and get ammo warnings
        counter_value = self.counter.get()

        self.reload()
        self.critical()
        self.out()

 
        # this sets the time at 100%
        timer_value = self.timer.get()
        timer_value = timer_value-66 or INITIAL_TIMER_VALUE
        self.timer.set(timer_value)
        # this sets the rmbar to 40%
        rmcount_count = self.rmcount.get()
        rmcount_count = 40
        self.rmcount.set(rmcount_count)
        # this sets the temperature
        temperature_count =  self.temperature.get()
        temperature_count = temperature_count+1
        self.temperature.set(temperature_count)
        if temperature_count == 90:
          self.coolbar()
          self.overheat()
        else:
          state_stat = self.stat.get()
          state_stat = ""
          self.stat.set(state_stat)

    def on_keyrelease_f(self, evet):
        #this adds logic to say rate is zero if not firing
        #this automatically turns off rate bar moment key is released fixing a logic issue
        rmcount_count = self.rmcount.get()
        rmcount_count = 0
        self.rmcount.set(rmcount_count)
        temperature_count =  self.temperature.get()
        if temperature_count >= 20:
          self.coolbar()

# this launches the next screen, the fire select screen 
    def on_button(self):
        secondframe = SecondFrame(self)
        self.withdraw()
        self.wait_window(secondframe)
        self.deiconify()
    def kudos(self):
        kudosframe = KudosFrame(self)
        self.withdraw()
        self.wait_window(kudosframe)
        self.deiconify()
    def on_keypress_k(self, evet):
        print("k pressed")
        self.kudos()
        playsound("click1.mp3")
# this reloads the game, you have to click it to make it the active window again
    def on_keypress_r(self, evet):
        self.destroy()
        self.create_splashframe 
        playsound("click1.mp3")
# this launches you to window three, the fire select window
    def on_keypress_space(self, evet):
        print("space pressed")
        self.on_button()
        playsound("click1.mp3")
# this quits and closes the window by hitting a single key
    def on_keypress_q(self, evet):
        self.destroy()
        self.quit()
        playsound("click1.mp3")

    # this sets the gun terminal identification
    # this can also be expanded to do other things if you want to alter the script
    def on_keypress_a(self, evet):
        which_gun = self.gun.get()
        which_gun = "A"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_b(self, evet):
        which_gun = self.gun.get()
        which_gun = "B"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_c(self, evet):
        which_gun = self.gun.get()
        which_gun = "C"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_d(self, evet):
        which_gun = self.gun.get()
        which_gun = "D"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    
#
#
# End fire menu class and related functions
#
#
#Begin secret credits(kudos) screen
#
#

class KudosFrame(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('512x256')
        self.title("Secret credits screen")
        self.focus_set()
        self.focus_force()
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.rowconfigure(self, 1, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 1, weight=1, uniform='a')

        r0c0 = tk.Button(self, text='Close', command=self.destroy, bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r0c0.grid(row=0, column=0, sticky="NSEW")
        r1c0 = tk.Label(self, text ='Alienslegacy.com Credits \n knoxvilles_joker aka gabriel vos new script  \n martinr1000 font and some coding help \n MLR 2007 for original flash script \n Facebook.com  theuscm \n youtube.com/channel/UC4KYYScA5WcdCZeiU6lcjdA \n cobra_shipwreck channel aka knoxvilles_joker', bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r1c0.grid(row=1, column=0, sticky="NSEW")
        r1c1 = tk.Label(self, text =' ', bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r1c1.grid(row=1, column=1, sticky="NSEW")
        r0c1 = tk.Label(self, text ='Python-forum.io credits \n Yoriz coding pointers and help \n ndc85430 coding critique \n ', bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r0c1.grid(row=0, column=1, sticky="NSEW")

        # These are the bind key definitions
        self.bind("<KeyPress-r>", self.on_keypress_r)
        self.bind("<KeyPress-space>", self.on_keypress_space)
        self.bind("<KeyPress-k>", self.on_keypress_k)
        self.bind("<KeyPress-q>", self.on_keypress_q)

    def on_button(self):
        secondframe = SecondFrame(self)
        self.withdraw()
        self.wait_window(secondframe)
        self.deiconify()
    def kudos(self):
        kudosframe = KudosFrame(self)
        self.withdraw()
        self.wait_window(kudosframe)
        self.deiconify()
# this reloads the game, you have to click it to make it the active window again
    def on_keypress_r(self, evet):
        self.destroy()         
        self.create_splashframe # this appears to launch the initial window        
    def on_keypress_r(self, evet):
        print("r pressed")        
        self.destroy()
  #      self.create_splashframe 
        playsound("click1.mp3")
    def on_keypress_k(self, evet):
        print("k pressed")        
        self.kudos()
        playsound("click1.mp3")
# this launches you to window three, the fire select window
    def on_keypress_space(self, evet):
        print("space pressed")
        self.on_button()
        playsound("click1.mp3")
# this quits and closes the window by hitting a single key
    def on_keypress_q(self, evet):
        self.destroy()
        self.quit()
        playsound("click1.mp3")
#
# End secret credits(kudos) screen
#
#
#
# The below two commands run the entire script
#  
tk_app = TkApp()
tk_app.mainloop()



RE: [split] [split] How to make a window stay on top - knoxvilles_joker - Apr-25-2021

As far as the example script I think that since classes are not being used the destroy functions do not work properly. In order for withdraw, destroy, deiconify calls to work properly class and method programmatic methods need to be used. So this example provide will provide popup windows based on a button click, but, you can not do a true splash screen with them.

I would prefer to just use functions over the class/method programming process as then I would not have to use repeat code to make everything work.


RE: [split] [split] How to make a window stay on top - BashBedlam - Apr-28-2021

I have another example for you that I hope will help you figure things out. Better late than never... Right?

from tkinter import *

class Splash_Screen (Tk) :
	def __init__ (self) :  
		Tk.__init__ (self)
		self.title ('')
		self.geometry ('400x200')
		label = Label (self, font = 48)
		label.config (text = '\n\nWelcome to the BashBedlam\nSuper Splash Screen!')
		label.pack ()
		self.after (3020, self.destroy)

class Main_Application :
	def __init__ (self) :
		self.root = Tk ()
		self.root.geometry ('600x400')
		self.root.title ('This is the Main Application')
		label = Label (self.root, text = '\n\n\nMain Application\n\n')
		label.pack ()
		button = Button (self.root, command = self.root.destroy)
		button.config (text = 'Press to Exit')
		button.pack ()

Splash_Screen ().after (3000, Main_Application)