tkinter Eingabefunktion nach Button

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
Philipdo
User
Beiträge: 2
Registriert: Mittwoch 1. April 2020, 09:34

Hallo Python Community!

Momentan arbeite ich gerade daran ein UI Code zu erstellen. Das Ding ist aber, dass ich gerne nach betätigen eines Button ein Label zur eingabe aufrufen möchte welche dann auch als eine neue Variable gekennzeichnet wird,
Unteranderem soll diese dann überschrieben werden beim erneuten durchführen des Codes. Sprich ich erstelle sogesehen eine Schleife daraus.
Leider finde ich einfach keine Erklärung dazu wie ich ein Label in einen Button setze.

Um alles nochmals zusammenzufassen:

- Hat Button erstellt will aber eine Eingabefunktion nach dem betätigen aufrufen.
-soll als neue Variable gespeichert werden und beim ernueten durchführen überschrieben werden.

Ich bedanke mich vorab schonmal für die Hilfe!

LG Philip :D

HIer ist der von mir geschriebene Code

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

#while 1:

import tkinter
import tkinter.messagebox

class Oberflaeche(tkinter.Frame):
def __init__(self, master=None):
tkinter.Frame.__init__(self, master)
self.pack()

self.barcode = tkinter.Button(self, text="Barcode scannen", command=self.barcode)
self.barcode.pack()

self.beenden = tkinter.Button(self, text="beenden", command=self.beenden)
self.beenden.pack()


def barcode():
button.config(text= "barcode scannen", command=barcode)
master = Tk()
barcode = Label(master, text="Barcode scannen").grid(row=0)

e1 = Entry(master)

e1.grid(row=0, column=1)


def barcode(self):
tkinter.messagebox.showinfo("Barcode", barcode)

def beenden(self):
root.destroy()

root = tkinter.Tk()
root.title("Wareneingang Rollenpapiere scannen")
root.minsize(width=300, height=100)
oberflaeche = Oberflaeche(master=root)
oberflaeche.mainloop()

"""
Code = input("Barcode scannen\n")

def Eingabe():
if Code == int:
Barcode = Code
else:
print = "Invalid syntax"
Eingabe()


import xml.dom.minidom as dom
import datetime as Datumsstempel
import time as Zeitstempel
DatumJetzt = str(Datumsstempel.date.today())
ZeitJetzt = Zeitstempel.strftime('%H.%M.%S')
Barcode = Code
Dateiname = Barcode+"_"+DatumJetzt+"_"+ZeitJetzt






print ("Content-type: text/plain\n\n")

baum = dom.Document()
tag_SAPWareneingang = dom.Element("SAPWareneingang")
tag_Import1 = dom.Element("Import1")
#tag_Ware.setAttribute("id", "1")
tag_Import2 = dom.Element("Import2")
tag_XML_ID_2 = dom.Element("XML_ID_2")

tag_XML_ID = dom.Element("XML_ID")
text = dom.Text()
text.data =Dateiname
tag_XML_ID.appendChild(text)

tag_User_ID = dom.Element("User_ID")
text = dom.Text()
text.data = ""
tag_User_ID.appendChild(text)

tag_Scanner_ID = dom.Element("Scanner_ID")
text = dom.Text()
text.data = ""
tag_Scanner_ID.appendChild(text)

tag_Prozess_ID = dom.Element("Prozess_ID")
text = dom.Text()
text.data = ""
tag_Prozess_ID.appendChild(text)

tag_Document_ID = dom.Element("Document_ID")
text = dom.Text()
text.data = ""
tag_Document_ID.appendChild(text)

tag_Order_ID = dom.Element("Order_ID")
text = dom.Text()
text.data = ""
tag_Order_ID.appendChild(text)

tag_Shipment_Number = dom.Element("Shipment_Number")
text = dom.Text()
text.data = ""
tag_Shipment_Number.appendChild(text)

tag_Shipment_Complete = dom.Element("Shipment_Complete")
text = dom.Text()
text.data = ""
tag_Shipment_Complete.appendChild(text)

tag_Completly_Consumed = dom.Element("Completly_Consumed")
text = dom.Text()
text.data = ""
tag_Completly_Consumed.appendChild(text)



tag_barcode = dom.Element("barcode")
text = dom.Text()
text.data = Barcode
tag_barcode.appendChild(text)

tag_zeit = dom.Element("zeit")
text = dom.Text()
text.data = ZeitJetzt.replace(".",":")
tag_zeit.appendChild(text)



tag_Datum = dom.Element("Datum")
text = dom.Text()
text.data = DatumJetzt
tag_Datum.appendChild(text)
tag_zeit.appendChild(text)
tag_Datum.appendChild(text)

tag_Import1.appendChild(tag_XML_ID)
tag_Import1.appendChild(tag_User_ID)
tag_Import1.appendChild(tag_Scanner_ID)
tag_Import1.appendChild(tag_Prozess_ID)
tag_Import1.appendChild(tag_Document_ID)
tag_Import1.appendChild(tag_Order_ID)
tag_Import1.appendChild(tag_Shipment_Number)
tag_Import1.appendChild(tag_Shipment_Complete)
tag_Import1.appendChild(tag_Completly_Consumed)

tag_XML_ID_2.appendChild(tag_barcode)
tag_XML_ID_2.appendChild(tag_zeit)
tag_XML_ID_2.appendChild(tag_Datum)

tag_Import2.appendChild(tag_XML_ID_2)
tag_Import1.appendChild(tag_Import2)
tag_SAPWareneingang.appendChild(tag_Import1)
baum.appendChild(tag_SAPWareneingang)
#PFAD = "C:\\SAP Wareneingang\\"+Barcode+"__"+Datum+"__"+Zeit+".xml", "w"
f = open("C:\\SAP Wareneingang\\"+Dateiname+".xml", "w")
baum.writexml(f, "", "\t", "\n")
f.close()



#if input(1)
#break
"""
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

tkinter wird üblicherweise als `import ikinter as tk` importiert, um sich etwas Schreibarbeit sparen zu können.
Nicht alles muß an Attribute gebunden werden. Der Knopf `self.barcode` wird nie wieder gebraucht, überdeckt aber die Methode mit selbem Namen.
Ein Frame sollte sich nicht selbst `pack`en, das ist Aufgabe des Erzeugers, denn der muß ja entscheiden können, ob er nun pack oder grid verwendet.
Die Methode `barcode` macht seltsame Dinge. Es wird ein `button` verwendet, was nicht existiert, und auf eine Funktion `barcode` verwiesen, die nicht existiert.
Es darf nur ein Exemplar von Tk geben. Weitere Fenster macht man mit TopLevel.
Der Code auf oberster Ebene sollte in eine Funktion, die üblicherweise `main` genannt wird, wandern.

Dann ist da noch Code in einem langen String-Literal:
Variablennamen schreibt man klein_mit_unterstrich. Funktionen sollten alles was sie brauchen per Argument bekommen. Eine Eingabe (Code) mit einem Datentype (int) zu vergleichen, ist nie sinnvoll. Du willst wahrscheinlich die Eingabe in ein int umwandeln und dabei den möglichen ValueError abfangen.
minidom sollte man nicht verwenden, das hat eine scheußliche API. ElementTree ist der Standard unter Python, um XML-Dateien zu verarbeiten.
Zeit und Datum müssen immer gleichzeitig abgefragt werden, sonst kann es passieren, dass Du das Datum um 23:59:59 abfragst, das Datum aber erst um 00:00:00.
Um Dateinamen zu generieren nimmt man Stringformatierung und stückelt nicht per + zusammen:

Code: Alles auswählen

now = Datumsstempel.now()
dateiname = f"C:\\SAP_Wareneingang\\{barcode}_{now:%Y-%m-%d_%H:%M:%S}.xml"
Das `print` sieht so aus, als ob Du da CGI-Programmierung machen möchtest. Macht man heutzutage nicht mehr, sondern nimmt ein entsprechendes Framework für HTTP-Antworten.
Dieses ganze DOM-Zeugs muß man dringend nach ElementTree umschreiben. Der Code wird mit SubElement um zwei Drittel kürzer.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier nochmal als Beispiel, wie einfach das ganze statt mit minidom mit ElementTree geht:

Code: Alles auswählen

from xml.etree import ElementTree as et
import datetime as Datumsstempel

def generate_xml(xml_id, barcode, timestamp)
    wareneingang = et.Element("SAPWareneingang")
    import1 = et.SubElement(wareneingang, "Import1")
    et.SubElement(import1, "XML_ID").text = xml_id
    et.SubElement(import1, "User_ID").text = ""
    et.SubElement(import1, "Scanner_ID").text = ""
    et.SubElement(import1, "Process_ID").text = ""
    et.SubElement(import1, "Document_ID").text = ""
    et.SubElement(import1, "Order_ID").text = ""
    et.SubElement(import1, "Shipment_Number").text = ""
    et.SubElement(import1, "Shipment_Complete").text = ""
    et.SubElement(import1, "Completly_Consumed").text = ""
    import2 = et.SubElement(import1, "Import2")
    xml_id2 = et.SubElement(import2, "XML_ID_2")
    et.SubElement(xml_id2, "barcode").text = barcode
    et.SubElement(xml_id2, "zeit").text = f"{timestamp:%H:%M:%S}"
    et.SubElement(xml_id2, "Datum").text = f"{timestamp:%Y-%m-%d}"
    return et.ElementTree(wareneingang)

def main():
    barcode = "12345"
    now = Datumsstempel.now()
    xml_id = f"{barcode}_{now:%Y-%m-%d_%H.%M.%S}"
    dateiname = f"C:\\SAP_Wareneingang\\{xml_id}.xml"
    tree = generate_xml(xml_id, barcode, now)
    tree.write(dateiname)
    
if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ist natürlich schon schöner als das gruselige DOM-Geraffel, aber ich würde noch einen Schritt weiter gehen und `lxml` empfehlen, denn das hat ein `builder`-Modul mit dem man das so schreiben kann, dass man die XML-Struktur auch deutlich im Code sehen kann (ungetestet):

Code: Alles auswählen

from lxml.etree import ElementTree as etree
from lxml.builder import E


def generate_xml(xml_id, barcode, timestamp):
    return etree.ElementTree(
        E.SAPWareneingang(
            E.Import1(
                E.XML_ID(xml_id),
                E.User_ID(),
                E.Scanner_ID(),
                E.Process_ID(),
                E.Document_ID(),
                E.Order_ID(),
                E.Shipment_Number(),
                E.Shipment_Complete(),
                E.Completely_Consumed(),
                E.Import2(
                    E.XML_ID_2(
                        E.barcode(barcode),
                        E.zeit(f"{timestamp:%H:%M:%S}"),
                        E.Datum(f"{timestamp:%Y-%m-%d}"),
                    )
                ),
            )
        )
    )
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten