Ich denke wir haben hier zwei Probleme: Ein OP der das Problem nicht so genau beschreibt wie möglich und Antwortende die Spass am bashen haben, aber sonst halt auch keine Ahnung vom Problem.
Wenn man nur den Dialog haben möchte, geht trotzdem *zusätzlich* noch ein leeres Tk-Hauptfenster auf. Und *das* möchte der OP halt nicht haben. Was ich durchaus nachvollziehen kann.
Das Problem ist, dass Tk-Programme halt immer dieses Hauptfenster haben.
Lösung (mehr oder weniger): Es selber aktiv erzeugen und dann mit der `withdraw()`-Methode unsichtbar machen. Und dann halt erst den Dialog öffnen.
Bei tkinter.messagebox das Tk-fenster verhindern
-
problembär
Wieso das denn? Ich habe oben doch eine Lösung ohne leeres Tk()-Fenster gepostet!Py-Prog hat geschrieben:Ich will verhindern das das Leere Tk() fenster startet. Und nach eueren antworten zu urteilen geht es nicht und ich muss die ausgabe fenster mit dem Tk() fenster machen damit ich kein leeres fenster auf dem Bildschirm habe.
Kann ja sein, daß EyDu das nicht gefällt, aber vielleicht bildest Du Dir erstmal eine eigene Meinung.
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Ich kann Dir nur zustimmen und fühle mich hier langsam aber gehörig veralbert.problembär hat geschrieben:Wieso das denn? Ich habe oben doch eine Lösung ohne leeres Tk()-Fenster gepostet!Py-Prog hat geschrieben:Ich will verhindern das das Leere Tk() fenster startet. Und nach eueren antworten zu urteilen geht es nicht und ich muss die ausgabe fenster mit dem Tk() fenster machen damit ich kein leeres fenster auf dem Bildschirm habe.
Kann ja sein, daß EyDu das nicht gefällt, aber vielleicht bildest Du Dir erstmal eine eigene Meinung.
Py-Prog: alles was wichtig ist habe ich so deutlich wie kaum irgendwo anders in meinem ersten Post zusammengefasst. Wenn Du das ignorieren willst, bitte. Aber dann brauchst Du Deine Fragen hier auch nicht zu posten.
Nochmal: um eine einfache Textnachricht auszugeben, brauchst Du keine tkMessageBox. Sowas nimmt man in komplexen Programmen, wenn öfters mal Informationen, Warnungen und Fragen aufpoppen sollen. Mach aus dem tk-Haupfenster Dein Message-Window (5 Zeilen Code reichen da aus) und schließ es danach wieder, schon hast Du Dein Ziel erfüllt und kein zuätzliches Fenster.
@BlackJack: ich kann Dir nicht zustimmen, das wir bashen. Unsere Vorschläge sind klar und sachlich formuliert worden.
Gruß,
Michael
ps.: Ein Daemon ist ein Programm, das von einer Konsole ausgekoppelt im Hintergrund läuft. Sowas kann man mit Python auch bewerkstelligen. Davon sollte man aber die Finger lassen, wenn man nicht genau weiß, was man da tut.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Was machst Du nicht? tkMessageBox, aber kein Tk verwenden? Hast Du Dich schonmal gefragt, woher das 'tk' vor tkMessageBox kommt?Py-Prog hat geschrieben:Mach ich doch garnicht. Wenn ich kein Tk verwende kommt das leere.
Die tkMessageBox ist im Prinzip auch nur ein zusammengesetztes Tkinter-Widget mit einer einfachen Schnittstelle. Du kannst auch Tkinter.Canvas() initialisieren und, wie ich bereits vorher schrieb, dabei wird als erstes ein Tk-Hauptfenster erzeugt.
Vielleicht war das Dein Denkfehler (tkMessageBox ist Teil von Tkinter).
Wenn Du tkMessageBox unbedingt verwenden möchtest, nimm meine Funktion und verwende 'root.widthdraw()' statt 'root.iconify()', um das Fenster komplett auszublenden. Das 'root.title' und 'root.protocol' kannst Du Dir dann auch sparen.
Gruß,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
@py-prog, es wurden dir schon viele und gute Tipps gegeben, die dir aber alle anscheinend nicht gefallen oder auch nicht das Problem lösen. Das Einfachste für uns und für dich wäre, wenn du deine Frage neu formolierst und den entsprechenden Code zeigst.
the more they change the more they stay the same
Code: Alles auswählen
import tkinter.messagebox
tkinter.messagebox.showinfo('Info', 'Text')Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Wer Rechtschreibfehler findet darf sie behalten.
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
... und Du hast kein Tkinter (=GUI) verwendet?Py-Prog hat geschrieben:Code: Alles auswählen
import tkinter.messagebox tkinter.messagebox.showinfo('Info', 'Text')
Sorry, ich helfe gern, aber hier steige ich aus. Ich glaub das übersteigt jetzt meinen Horizont. Was zu sagen war, ist gesagt. Vielleicht lass ich mich überreden, wenn Du uns endlich verrätst, WAS Dir denn an den vorgeschlagenen Lösungen nicht gefällt (und Du noch optimieren möchtest). Das ist wohl die Kernfrage.
btw: ist das Python 3.x??
Gruß und viel Erfolg noch,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Hallo zusammen,
zufällig bin ich auf diesen alten Thread gestoßen und habe mit der Vorlage von problembär und Michael Schneider, dieses mal gebastelt:
zufällig bin ich auf diesen alten Thread gestoßen und habe mit der Vorlage von problembär und Michael Schneider, dieses mal gebastelt:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x
import tkinter as tk
class MessageBox(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.option_add('*font', ('Arial', 15, 'normal'))
self.geometry('+340+240')
self.bind(sequence='<Control-q>', func=lambda e: self.destroy())
self.lab1 = tk.Label(self, text='')
self.lab1.pack(padx=30, pady=30)
self.binding = {0 : '<Return>', 1 : '<Button-1>',
2 : '<KP_Enter>', 3 : '<j>', 4 : '<J>', 5 : '<Escape>',
6 : '<n>', 7 : '<N>'}
def func_1(self, event):
self.destroy()
self.call = True
def func_2(self, event):
self.destroy()
self.call = False
def button_1(self, t):
bt1 = tk.Button(self, text=t, width=6)
for key in self.binding:
if key <= 4:
bt1.bind(sequence=self.binding[key], func=self.func_1)
bt1.focus()
bt1.pack(side=tk.LEFT, anchor=tk.CENTER, padx=10, pady=10)
def button_2(self, t):
bt2 = tk.Button(self, text=t, width=6)
for key in self.binding:
if key <= 2 or key >= 5:
bt2.bind(sequence=self.binding[key], func=self.func_2)
bt2.pack(side=tk.LEFT, anchor=tk.CENTER, padx=10, pady=10)
def ok(self, message):
self.title('Info')
self.lab1['text'] = message
self.button_1('Ok')
self.mainloop()
return self.call
def infook(self, message):
self.title('Frage')
self.lab1['text'] = message
self.button_1('Ok')
self.button_2('Abbruch')
self.mainloop()
return self.call
def yesno(self, message):
self.title('Frage')
self.lab1['text'] = message
self.button_1('Ja')
self.button_2('Nein')
self.mainloop()
return self.call
if __name__ == '__main__':
result = MessageBox().yesno('Hallo')
print(result)
