Besonderheiten der messagebox

Fragen zu Tkinter.
Antworten
jake-the-snake

Hallo Forum

Ich habe mal ein paar Tests mit dem widget messagebox gemacht. In der Regel ist die Box immer im Vordergrund und stoppt normal den Programmablauf für die Erscheinungsdauer, bzw. bis auf einen Knopf gedrückt wird.

Das habe ich mit Toplevel-Fenster noch nicht hinbekommen.
Gibt es denn keine Möglichkeit, eine messagebox ohne Knöpfe aufzurufen. So wie die showinfo-Variante, nur eben ohne Knöpfe. Diese müsste dann ein paar Sekunden stehen bleiben und sich dannach wieder in Luft auflösen. Wo ist überhaupt der Programmcode der messagebox abgelegt. Kommt man da an das Modul ran?

Gruss jts
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jake-the-snake

Kannst du einmal das folgende Skript bei dir ausprobieren?:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk

APP_TITLE = "Custom Messagebox"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200

        
class Application(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title(APP_TITLE)
    
    def build(self):
        self.protocol("WM_DELETE_WINDOW", self.close_app)
        self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
        self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
        self.option_add("*Button.highlightThickness", 0)

        # Trial container-01
        self.app_container_01 = tk.Frame(self, bg='yellow', bd=0)
        self.app_container_01.pack(side='left', fill='both', expand=True)
        tk.Button(self.app_container_01, text='Show my Messagebox',
            command=self.my_msg_box).pack(expand=True)
    
    def my_msg_box(self):
        msg_win = tk.Toplevel()
        label = tk.Label(msg_win, text="My Messagebox!", font=18)
        label.pack(expand=True, padx=40, pady=20)
        msg_win.transient(self)
        msg_win.grab_set()
            
    def close_app(self):
        # Here do something before apps shutdown
        print("Good Bye!")
        self.destroy()

        
def main():        
    app = Application()
    app.build()
    app.mainloop()

    
if __name__ == '__main__':
    main()      
Gruss wuf :wink:
Take it easy Mates!
jake-the-snake

Hallo wuf

Habe es ausprobiert. Musste am Kopf des Skriptes ein paar Abänderungen durchführen, sonst lief es nicht:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
     
# Tkinter for Python 3.xx
import tkinter as tk
     
APP_TITLE = "Custom Messagebox"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200
Die try-Geschichte musste ich entfernen, weil die Fehler warfen, da die Module alle über pyton3 installiert sind.
Das Programm habe ich getestet. Also können Messageboxen ohne Buttons erstellt werden. Leider bleibt das Grundproblem.
Steht der mainloop - kann keine Notfallbox geöffnet werden.

Ist denn Grundsätzlich immer nur eine mainloop möglich?

Gruss jts
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@jake-the-snake: das entscheidende ist `grab_set`, das verhindert, dass man in andere Fenster wechseln kann. Wie man das grundsätzliche Problem angehen kann, haben wir Dir glaube ich jetzt schon tausendmal gesagt. Das mit *-Importen auch. Irgendwie sehe ich nicht, dass Du irgendwelche Fortschritte machst.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

jake-the-snake hat geschrieben: Ist denn Grundsätzlich immer nur eine mainloop möglich?

Hatten wir doch schon: viewtopic.php?f=18&t=42046&p=320845#p320828

GUIs sind EREIGNISBASIERT. Ereignisse sind Tastendruecke, Mausbewegungen, Klicks, Timer (erzeugt durch after) und andere IO. Ereignisse werden nur durch betreten des mainloop abgefragt, und wie ich schon schrieb, zumindest mal in Tkinter gibt es davon nur genau einen.
jake-the-snake

Hallo Forum

Ist ja gut... wenn auch nicht befriedigend!

Das ganze Konzept mit der GUI...
Zu C64 Zeiten konnte man jeden verdammten einzelnen Bildpunkt ansprechen - zu jeder Zeit, überall im Programm...
Zugegeben, war halt Handarbeit - dafür hatte man das dann so, wie man es wollte. Die Zuzählgeschichte wegen zu kleiner Bytewerte (Bildschirmbreite) mal ausgenommen.

Tja... Bleibt nur noch ein Insider-Wintergedicht:
--------------------------------------------------------------------

Ist's im Winter kalt und schneit's -
Vermisst der Programmierer Bobs and Sprites !

Im Radio lief noch En Vogue -
Im Programm nutzte man Peek and Poke !

War man müde, hieß es Gut' Nacht -
Mit SYS sechs, vier, sieben, drei und Acht !

--------------------------------------------------------------------

Alles klar, Danke für die Hilfe - alles gut!

Gruss jts
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du auch alles heute noch machen. Es war deine Entscheidung, tkinter zu benutzen. Wenn du mehr Kontrolle ueber einzelne Pixel und die Ereignisverarbeitung willst, nimm halt pygame. Aber Sinn und Zweck von tkinter sind eben nicht Anwendungen deiner Art, sondern deutlich komplexere UIs. Wobei auch du schon mit deinen Textboxen vieles nutzt, was du mit peek und poke erstmal zusammengestoppelt bekommen musst.
Antworten