Forum: PC-Programmierung Python, Typenkonversionsrechner (HEX;INT;FLOAT;ASCII;BIN), Tkinter, wie Code vereinfachen??


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Matthias (Gast)


Angehängte Dateien:
  • preview image for py.jpg
    py.jpg
    116 KB, 179 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich habe einen kleinen Rechner als Tkinter-Python-Script geschrieben, 
welches die Eingabe von Hex, INT, FLOAT, ASCII und BIN-Werten und deren 
Umrechnung in jeweils die anderen Format ermöglicht.

Zweifellos, es ist soch nicht ausgereift und bedarf daher allein noch 
einiger Verbesserungen, wie z.b. einer Historie der letzten berechneten 
Werte, die unten angehangen werden soll.

Dabei stoße ich nun auf das Problem den Code "Aufblähen" zu müssen.

Für einen kopierfähigen Eintrag nutze ich ein Label
label11 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 
14))
label11.insert(1.0, "INTEGER")
label11.tag_configure('bold_italics',font=('Arial', 14,'bold', 
'italic'))
label11.grid(row=1,column=1,padx=5, pady=5)

Dies braucht so 4 Zeilen. Allein um angelegt zu sein.
Wäre es nicht möglich die Labels in einer Schleife, welche die Matrix 
durchitteriert automatisch mit Werten aus einer Liste anlegen zu lassen?
Dabei müsste der Instanzname "label11" jedoch durch einen Text in dieser 
Liste angelegt werden, oder durch i,y der Schleifen der Feldanlage.
Generell sollten auch die anderen vielfach in Prinzip identisch auf alle 
Labels angewandten anweisungen irgendwie reduziert werden...


Wie kann ich die Labels also automatisch anlegen lassen?
Habt ihr eine Idee?

Schöne Grüße,
Matthias

Hier Kurz der Code
import tkinter as tk
from tkinter import *
import struct
import binascii
import codecs
import struct
import ctypes
import binascii

def binary(num):
    return format(struct.unpack('!I', struct.pack('!f', num))[0], '032b')


window = tk.Tk()

input_width=25

for i in range(8):
        for j in range(6):
            frame = tk.Frame(
            master=window,
            relief=tk.RAISED,
            borderwidth=1
            )
            frame.grid(row=i, column=j,padx=5, pady=5)
        
#HEADLINE
label00 = tk.Label(
    text="Hexadecimal",
    width=16,
    font = ('Arial' , 14),
    foreground="black",  # Set the text color to white
)
label00.grid(row=0,column=0,padx=5, pady=5)

label01 = tk.Label(
    text="Integer",
    width=20,
    font = ('Arial' , 14),
    foreground="black",  # Set the text color to white
)
label01.grid(row=0,column=1,padx=5, pady=5)

label02 = tk.Label(
    text="Float",
    width=25,
    font = ('Arial' , 14),
    foreground="black",  # Set the text color to white
)
label02.grid(row=0,column=2,padx=5, pady=5)

label03 = tk.Label(
    text="ASCII",
    width=9,
    font = ('Arial' , 14),
    foreground="black",  # Set the text color to white
)
label03.grid(row=0,column=3,padx=5, pady=5)

label04 = tk.Label(
    text="BIN",
    width=64,
    font = ('Arial' , 14),
    foreground="black",  # Set the text color to white
)
label04.grid(row=0,column=4,padx=5, pady=5)
#ENDE-HEADLINE

#HEX-CALC
hexe = tk.Entry(text="ffff", fg="black", bg="yellow", font = ('Courier' , 14), width=16,borderwidth=10)
hexe.insert(END, "ffff")
hexe.grid(row=1,column=0)

label11 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
label11.insert(1.0, "INTEGER")
label11.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label11.grid(row=1,column=1,padx=5, pady=5)

label12 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
label12.insert(1.0, "FLOAT")
label12.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label12.grid(row=1,column=2,padx=5, pady=5)

label13 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
label13.insert(1.0, "ASCII")
label13.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label13.grid(row=1,column=3,padx=5, pady=5)

label14 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
label14.insert(1.0, "BIN")
label14.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label14.grid(row=1,column=4,padx=5, pady=5)
#END HEX-CALC

#INT-CALC
label20 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
label20.insert(1.0, "HEX")
label20.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label20.grid(row=2,column=0,padx=5, pady=5)

inte = tk.Entry(text="100", fg="black", bg="yellow", font = ('Courier' , 14), width=20,borderwidth=10)
inte.insert(END, "12345 ")
inte.grid(row=2,column=1)

label22 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
label22.insert(1.0, "FLOAT")
label22.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label22.grid(row=2,column=2,padx=5, pady=5)

label23 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
label23.insert(1.0, "ASCII")
label23.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label23.grid(row=2,column=3,padx=5, pady=5)

label24 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
label24.insert(1.0, "BIN")
label24.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label24.grid(row=2,column=4,padx=5, pady=5)
#END INT-CALC

#FLOAT-CALC
label30 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
label30.insert(1.0, "HEX")
label30.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label30.grid(row=3,column=0,padx=5, pady=5)

label31 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
label31.insert(1.0, "INTEGER")
label31.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label31.grid(row=3,column=1,padx=5, pady=5)

floate = tk.Entry(text="2.0", fg="black", bg="yellow", font = ('Courier' , 14), width=input_width,borderwidth=10)
floate.insert(END, "3.5")
floate.grid(row=3,column=2)

label33 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
label33.insert(1.0, "ASCII")
label33.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label33.grid(row=3,column=3,padx=5, pady=5)

label34 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
label34.insert(1.0, "BIN")
label34.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label34.grid(row=3,column=4,padx=5, pady=5)
#END FLOAT-CALC

#ASCII-CALC
label40 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
label40.insert(1.0, "HEX")
label40.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label40.grid(row=4,column=0,padx=5, pady=5)

label41 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
label41.insert(1.0, "INTEGER")
label41.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label41.grid(row=4,column=1,padx=5, pady=5)

label42 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
label42.insert(1.0, "FLOAT")
label42.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label42.grid(row=4,column=2,padx=5, pady=5)

asciie = tk.Entry(text="paul", fg="black", bg="yellow", font = ('Courier' , 14), width=9,borderwidth=10)
asciie.insert(END, "paul")
asciie.grid(row=4,column=3)

label44 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
label44.insert(1.0, "BIN")
label44.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
label44.grid(row=4,column=4,padx=5, pady=5)
#END ASCII-CALC

#BIN-CALC
label50 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
label50.insert(1.0, "HEX")
label50.grid(row=5,column=0,padx=5, pady=5)

label51 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
label51.insert(1.0, "INTEGER")
label51.grid(row=5,column=1,padx=5, pady=5)

label52 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
label52.insert(1.0, "FLOAT")
label52.grid(row=5,column=2,padx=5, pady=5)

label53 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
label53.insert(1.0, "ASCII")
label53.grid(row=5,column=3,padx=5, pady=5)

bine = tk.Entry(text="01011010", fg="black", bg="yellow", font = ('Courier' , 14), width=64,borderwidth=10)
bine.insert(END, "01011010")
bine.grid(row=5,column=4)
#END BIN-CALC

def hex_calc():
#1. Zeile
    integer=0
    hex_in=hexe.get()
    label11.delete(1.0,END)
    label11.insert(1.0,str(int(hex_in,16)))

    label12.delete(1.0,END)
    f1=struct.unpack('f', struct.pack('I', int(hex_in, 16)))
    #print("F1 : "+str(f1))
    #f2=round(f1[0],8)
    #print("F2 : "+str(f2).format())
    label12.insert(1.0,str(f1[0]))

    label13.delete(1.0,END)
    label13.insert(1.0,bytes.fromhex(hex_in))

    label14.delete(1.0,END)
    text=bin(int(hex_in, 16))
    label14.insert(1.0,text[2:])
#2.Zeile
    inte_in=int(inte.get())
    label20.delete(1.0,END)
    label20.insert(1.0,str(hex(inte_in)))

    label22.delete(1.0,END)
    label22.insert(1.0,str(float(inte_in)))

    label23.delete(1.0,END)
    #print(hex(inte_in)[2:])
    label23.insert(1.0,bytes.fromhex(hex(inte_in)[2:]))

    label24.delete(1.0,END)
    text=bin(inte_in)
    label24.insert(1.0,text[2:])
#3.Zeile
    floate_in=float(floate.get())
    label30.delete(1.0,END)
    label30.insert(1.0,str(hex(struct.unpack('<I', struct.pack('<f', floate_in))[0])))

    label31.delete(1.0,END)
    label31.insert(1.0,str(int(floate_in)))

    label33.delete(1.0,END)
    label33.insert(1.0,bytes.fromhex(hex(struct.unpack('<I', struct.pack('<f', floate_in))[0])[2:]))

    label34.delete(1.0,END)
    label34.insert(1.0,binary(floate_in))
#4.Zeile
    asciie_in=asciie.get()
    label40.delete(1.0,END)
    h = binascii.hexlify(asciie_in.encode())
    label40.insert(1.0,h.decode())

    label41.delete(1.0,END)
    label41.insert(1.0,int(h.decode(), 16))

    label42.delete(1.0,END)
    f2=struct.unpack('f', struct.pack('I', int(h, 16)))
    label42.insert(1.0,float(f2[0]))
    
    label44.delete(1.0,END)
    label44.insert(1.0,bin(int(h, 16))[2:])
#5.Zeile
    bine_in=bine.get()
    label50.delete(1.0,END)
    label50.insert(1.0,hex(int(bine_in, 2)))
    h=hex(int(bine_in, 2))

    label51.delete(1.0,END)
    label51.insert(1.0,int(bine_in, 2))

    label52.delete(1.0,END)
    f2=struct.unpack('f', struct.pack('I', int(h, 16)))
    label52.insert(1.0,float(f2[0]))

    label53.delete(1.0,END)
    label53.insert(1.0,bytes.fromhex(hex(int(bine_in, 2))[2:]))

calc = tk.Button(
    command=hex_calc,
    text="HEX-Calc",
    width=12,
    font = ('Arial' , 14),
    bg="white",
    fg="Black",
)
calc.grid(row=0,column=5,padx=5, pady=5)

calc = tk.Button(
    command=hex_calc,
    text="Save2File",
    width=12,
    font = ('Arial' , 14),
    bg="white",
    fg="Black",
)
calc.grid(row=1,column=5,padx=5, pady=5)

window.mainloop()

von wer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Indem du die Labels in eine Liste packst und über den Index ansprichst

von Micha (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Pack die relevanten Elemente einer Zeile in eine Liste und die so 
entstandene Sammlung solcher Listen ebenfalls in eine Liste. Dann 
iterierst du über die äußere Liste und holst dir die Elemente der 
inneren Liste. Für die Nummerierung der Label nutzt du die Zeilennummer.

von Matthias (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo wer und Micha :)
Danke für den TIP :)
Das werd ich heute Abend mal versuchen...
Grüße Matthias

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht lesenswert
Matthias schrieb:
>
> window = tk.Tk()
> 

Ich weiß, die meisten Tutorials machen das so. Aber das ist... 
Verzeihung, schlechte Medizin!

Tatsache ist: man kann von Tkinter (und Tix) erben. Da das aber alte 
Klassen sind, die nicht von object erben, funktioniert super() leider 
nicht. Aber auf die "alte" Art geht das natürlich trotzdem:
import Tix as T

class mainWin(T.Tk):
    def __init__(self, *args, **kwargs):
        T.Tk.__init__(self, *args, **kwargs)
        self.exitBtn = T.Button(self, text='Exit', command=self.destroy)
        self.exitBtn.pack(side=T.TOP)
 
        for i in range(3):
            T.Button(self, text='X' + str(i), command=self.destroy).pack(side=T.TOP)
            

if __name__ == '__main__':
    mainWin().mainloop()

Auf diese Weise kannst Du auch von Tix.Frame (oder Tkinter.Frame, ...) 
erben, und damit Deine eigenen Widgets schreiben. Außerdem lassen sich 
Widgets natürlich in Listen und anderen Datenstrukturen organisieren, 
... oder Events daran binden mit "bind()", oder ... ;-)

Have fun!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.