Störendes tkinter-Fenster

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

ich möchte heute mal einem Phänomen nachgehen, das ich bei tkinter festgestellt habe.

Erzeuge ich mit tkinter eine GUI, startet neben der GUI auch immer ein tkinter-Fenster.
Der Fenstertitel beginnt immer mit: <tk #> und einer Zahl.
Als Beispiel, würde ich gerne ein PNG-Bild hier hochladen, aber das geht hier wohl nicht.

Ich verwende Linux Kubuntu 16.04.
Dort löse ich das Problem über: Fensterregeln > Anordnung & Zugriff
Einstellung: Im Hintergrund halten > erzwingen > ja
Einstellung: Nicht in Kontrollleiste > erzwingen > ja

Was mich interessiert:
- Wieso wird zusätzlich zu der tkinter-GUI ein weiteres tkinter-Fenster geöffnet?
- Gibt es eine Lösung in tkinter, um nicht im Betriebssystem diese Einstellungen vornehmen zu müssen?

Grüße Nobuddy
BlackJack

@Nobuddy: Das sollte nicht passieren also sollte es da nichts zu lösen geben. Wenn es doch passiert, dann machst Du irgendwas falsch.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, hast recht, da hat sich ein kleiner Fehler in einem Modul eingeschlichen, das ich erst jetzt bemerkt habe.
Hier habe ich tk.Tk() aufgerufen, aber am Ende das destroy() vergessen ... :wink:
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

PS Imagehoster googlen, da gibt es einige, wo du Bilder hochladen und dann hier mit dem Img-Tag aus der Symbolleiste verlinken kannst (Entfernen persönlicher Daten nicht vergessen...).
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@pixewakb, Danke für den Tip!

Hier das Bild.
Bild
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich weiß ja jetzt nicht, wofür du es brauchst, aber vielleicht solltest Du mal einen Blick auf pyQt werfen und insbesondere auf die Möglichkeit uis mit dem Designer zusammenzuklicken und on the fly im Python-Skript zu laden.

Nur zur Veranschaulichung: http://projects.skylogic.ca/blog/how-to ... ython-3-4/

Es gibt auch Möglichkeiten eine ui-Datei direkt zu laden und nicht erst in Python-Code zu übersetzen.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@pixewakb, mein eigentliches Problem in diesem Thread ist gelöst!

Dein Vorschlag mit pyQt und dem Designer, werde ich mal genauer anschauen.
Bisher habe ich alles mit Tkinter erledigt, weil es einfach umzusetzen ist.
pyQt ist da schon etwas komplizierter.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Wenn Du mal ein, zwei Tage investiert hast, ist es m. E. einfacher und du kommst schneller zu Ergebnissen.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Habe mal mit dem Designer ein kleines Fenster erstellt und in py umgewandelt.

Code: Alles auswählen

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created: Wed Jun 21 15:20:50 2017
#      by: PyQt5 UI code generator 5.2.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 120)
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(30, 80, 341, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(30, 20, 341, 41))
        self.label.setObjectName("label")

        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        Dialog.setToolTip(_translate("Dialog", "<html><head/><body><p><br/></p></body></html>"))
        Dialog.setWhatsThis(_translate("Dialog", "<html><head/><body><p><br/></p></body></html>"))
        self.label.setText(_translate("Dialog", "<html><head/><body><p><span style=\" font-size:14pt;\">Änderung übernehmen?</span></p></body></html>"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
Fenster funktioniert, aber wie fange ich die Werte der 2 Buttons (ok / cancel) ab?
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

GUIs mache ich schon seit Jahren nicht mehr :oops:

Bei PyQt gibt es ein Konzept von Signalen und Ereignissen, wenn ich mich da richtig erinnere. Du bindest im Prinzip Signale oder Ereignisse aus dem GUI an deinen Code und legst so fest, was passiert, wenn es zu einer Benutzerinteraktion gekommen ist.

Ganz optimal ist Dein Code so übrigens nicht. Professioneller wird meines Erachtens direkt das ui-file geladen, wofür es eine eigene Funktion/Methode gibt (müsstest du mal googlen). Vorteil Deiner Methode ist, dass man auch mal sieht, was man da macht.

Hilft Dir - bezogen auf deine konkrete Frage - das weiter???

https://www.tutorialspoint.com/pyqt/pyq ... _slots.htm
BlackJack

@Nobuddy: Da Du für die Standardbuttons einen gewählt hast der die `AcceptRole` hat (Ok) und einen der die `RejectRole` hat (Cancel), werden die `accepted` und `rejected`-Signale wie man im Code sieht schon mit `accept()` und `reject()` vom Dialog verbunden.

`QDialog` wiederum hat selbst `accepted` und `rejected` als Signal und ein `finished` das den Rückgabewert übermittelt.

Dieser Wert wird aber auch von `QDialog.exec_()` zurückgegeben, falls man den Dialog Modal anzeigen möchte.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@pixewakb, habe den Code 1:1 aus dem Designer übernommen und dann mittels Befehl "pyuic5 -x untitled.ui -o untitled.py" umgewandelt.
Ist ja auch nur mal zu Anschauen, wie so etwas mit PyQt funktioniert. Bis man da richtig drin ist, das wird schon eine Weile dauern.

@BlackJack, Danke für den Tip!
So, bekomme ich auch eine Rückmeldung:

Code: Alles auswählen

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    result = Dialog.exec_()
    print(result)
    sys.exit(result)
Danke für Eure Hilfe!

Grüße Nobuddy
Antworten