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:

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
1
import tkinter as tk
2
from tkinter import *
3
import struct
4
import binascii
5
import codecs
6
import struct
7
import ctypes
8
import binascii
9
10
def binary(num):
11
    return format(struct.unpack('!I', struct.pack('!f', num))[0], '032b')
12
13
14
window = tk.Tk()
15
16
input_width=25
17
18
for i in range(8):
19
        for j in range(6):
20
            frame = tk.Frame(
21
            master=window,
22
            relief=tk.RAISED,
23
            borderwidth=1
24
            )
25
            frame.grid(row=i, column=j,padx=5, pady=5)
26
        
27
#HEADLINE
28
label00 = tk.Label(
29
    text="Hexadecimal",
30
    width=16,
31
    font = ('Arial' , 14),
32
    foreground="black",  # Set the text color to white
33
)
34
label00.grid(row=0,column=0,padx=5, pady=5)
35
36
label01 = tk.Label(
37
    text="Integer",
38
    width=20,
39
    font = ('Arial' , 14),
40
    foreground="black",  # Set the text color to white
41
)
42
label01.grid(row=0,column=1,padx=5, pady=5)
43
44
label02 = tk.Label(
45
    text="Float",
46
    width=25,
47
    font = ('Arial' , 14),
48
    foreground="black",  # Set the text color to white
49
)
50
label02.grid(row=0,column=2,padx=5, pady=5)
51
52
label03 = tk.Label(
53
    text="ASCII",
54
    width=9,
55
    font = ('Arial' , 14),
56
    foreground="black",  # Set the text color to white
57
)
58
label03.grid(row=0,column=3,padx=5, pady=5)
59
60
label04 = tk.Label(
61
    text="BIN",
62
    width=64,
63
    font = ('Arial' , 14),
64
    foreground="black",  # Set the text color to white
65
)
66
label04.grid(row=0,column=4,padx=5, pady=5)
67
#ENDE-HEADLINE
68
69
#HEX-CALC
70
hexe = tk.Entry(text="ffff", fg="black", bg="yellow", font = ('Courier' , 14), width=16,borderwidth=10)
71
hexe.insert(END, "ffff")
72
hexe.grid(row=1,column=0)
73
74
label11 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
75
label11.insert(1.0, "INTEGER")
76
label11.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
77
label11.grid(row=1,column=1,padx=5, pady=5)
78
79
label12 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
80
label12.insert(1.0, "FLOAT")
81
label12.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
82
label12.grid(row=1,column=2,padx=5, pady=5)
83
84
label13 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
85
label13.insert(1.0, "ASCII")
86
label13.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
87
label13.grid(row=1,column=3,padx=5, pady=5)
88
89
label14 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
90
label14.insert(1.0, "BIN")
91
label14.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
92
label14.grid(row=1,column=4,padx=5, pady=5)
93
#END HEX-CALC
94
95
#INT-CALC
96
label20 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
97
label20.insert(1.0, "HEX")
98
label20.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
99
label20.grid(row=2,column=0,padx=5, pady=5)
100
101
inte = tk.Entry(text="100", fg="black", bg="yellow", font = ('Courier' , 14), width=20,borderwidth=10)
102
inte.insert(END, "12345 ")
103
inte.grid(row=2,column=1)
104
105
label22 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
106
label22.insert(1.0, "FLOAT")
107
label22.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
108
label22.grid(row=2,column=2,padx=5, pady=5)
109
110
label23 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
111
label23.insert(1.0, "ASCII")
112
label23.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
113
label23.grid(row=2,column=3,padx=5, pady=5)
114
115
label24 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
116
label24.insert(1.0, "BIN")
117
label24.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
118
label24.grid(row=2,column=4,padx=5, pady=5)
119
#END INT-CALC
120
121
#FLOAT-CALC
122
label30 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
123
label30.insert(1.0, "HEX")
124
label30.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
125
label30.grid(row=3,column=0,padx=5, pady=5)
126
127
label31 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
128
label31.insert(1.0, "INTEGER")
129
label31.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
130
label31.grid(row=3,column=1,padx=5, pady=5)
131
132
floate = tk.Entry(text="2.0", fg="black", bg="yellow", font = ('Courier' , 14), width=input_width,borderwidth=10)
133
floate.insert(END, "3.5")
134
floate.grid(row=3,column=2)
135
136
label33 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
137
label33.insert(1.0, "ASCII")
138
label33.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
139
label33.grid(row=3,column=3,padx=5, pady=5)
140
141
label34 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
142
label34.insert(1.0, "BIN")
143
label34.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
144
label34.grid(row=3,column=4,padx=5, pady=5)
145
#END FLOAT-CALC
146
147
#ASCII-CALC
148
label40 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
149
label40.insert(1.0, "HEX")
150
label40.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
151
label40.grid(row=4,column=0,padx=5, pady=5)
152
153
label41 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
154
label41.insert(1.0, "INTEGER")
155
label41.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
156
label41.grid(row=4,column=1,padx=5, pady=5)
157
158
label42 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
159
label42.insert(1.0, "FLOAT")
160
label42.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
161
label42.grid(row=4,column=2,padx=5, pady=5)
162
163
asciie = tk.Entry(text="paul", fg="black", bg="yellow", font = ('Courier' , 14), width=9,borderwidth=10)
164
asciie.insert(END, "paul")
165
asciie.grid(row=4,column=3)
166
167
label44 = Text(window, height=1, borderwidth=0,width=64,font=("Arial", 14))
168
label44.insert(1.0, "BIN")
169
label44.tag_configure('bold_italics',font=('Arial', 14,'bold', 'italic'))
170
label44.grid(row=4,column=4,padx=5, pady=5)
171
#END ASCII-CALC
172
173
#BIN-CALC
174
label50 = Text(window, height=1, borderwidth=0,width=16,font=("Arial", 14))
175
label50.insert(1.0, "HEX")
176
label50.grid(row=5,column=0,padx=5, pady=5)
177
178
label51 = Text(window, height=1, borderwidth=0,width=20,font=("Arial", 14))
179
label51.insert(1.0, "INTEGER")
180
label51.grid(row=5,column=1,padx=5, pady=5)
181
182
label52 = Text(window, height=1, borderwidth=0,width=25,font=("Arial", 14))
183
label52.insert(1.0, "FLOAT")
184
label52.grid(row=5,column=2,padx=5, pady=5)
185
186
label53 = Text(window, height=1, borderwidth=0,width=9,font=("Arial", 14))
187
label53.insert(1.0, "ASCII")
188
label53.grid(row=5,column=3,padx=5, pady=5)
189
190
bine = tk.Entry(text="01011010", fg="black", bg="yellow", font = ('Courier' , 14), width=64,borderwidth=10)
191
bine.insert(END, "01011010")
192
bine.grid(row=5,column=4)
193
#END BIN-CALC
194
195
def hex_calc():
196
#1. Zeile
197
    integer=0
198
    hex_in=hexe.get()
199
    label11.delete(1.0,END)
200
    label11.insert(1.0,str(int(hex_in,16)))
201
202
    label12.delete(1.0,END)
203
    f1=struct.unpack('f', struct.pack('I', int(hex_in, 16)))
204
    #print("F1 : "+str(f1))
205
    #f2=round(f1[0],8)
206
    #print("F2 : "+str(f2).format())
207
    label12.insert(1.0,str(f1[0]))
208
209
    label13.delete(1.0,END)
210
    label13.insert(1.0,bytes.fromhex(hex_in))
211
212
    label14.delete(1.0,END)
213
    text=bin(int(hex_in, 16))
214
    label14.insert(1.0,text[2:])
215
#2.Zeile
216
    inte_in=int(inte.get())
217
    label20.delete(1.0,END)
218
    label20.insert(1.0,str(hex(inte_in)))
219
220
    label22.delete(1.0,END)
221
    label22.insert(1.0,str(float(inte_in)))
222
223
    label23.delete(1.0,END)
224
    #print(hex(inte_in)[2:])
225
    label23.insert(1.0,bytes.fromhex(hex(inte_in)[2:]))
226
227
    label24.delete(1.0,END)
228
    text=bin(inte_in)
229
    label24.insert(1.0,text[2:])
230
#3.Zeile
231
    floate_in=float(floate.get())
232
    label30.delete(1.0,END)
233
    label30.insert(1.0,str(hex(struct.unpack('<I', struct.pack('<f', floate_in))[0])))
234
235
    label31.delete(1.0,END)
236
    label31.insert(1.0,str(int(floate_in)))
237
238
    label33.delete(1.0,END)
239
    label33.insert(1.0,bytes.fromhex(hex(struct.unpack('<I', struct.pack('<f', floate_in))[0])[2:]))
240
241
    label34.delete(1.0,END)
242
    label34.insert(1.0,binary(floate_in))
243
#4.Zeile
244
    asciie_in=asciie.get()
245
    label40.delete(1.0,END)
246
    h = binascii.hexlify(asciie_in.encode())
247
    label40.insert(1.0,h.decode())
248
249
    label41.delete(1.0,END)
250
    label41.insert(1.0,int(h.decode(), 16))
251
252
    label42.delete(1.0,END)
253
    f2=struct.unpack('f', struct.pack('I', int(h, 16)))
254
    label42.insert(1.0,float(f2[0]))
255
    
256
    label44.delete(1.0,END)
257
    label44.insert(1.0,bin(int(h, 16))[2:])
258
#5.Zeile
259
    bine_in=bine.get()
260
    label50.delete(1.0,END)
261
    label50.insert(1.0,hex(int(bine_in, 2)))
262
    h=hex(int(bine_in, 2))
263
264
    label51.delete(1.0,END)
265
    label51.insert(1.0,int(bine_in, 2))
266
267
    label52.delete(1.0,END)
268
    f2=struct.unpack('f', struct.pack('I', int(h, 16)))
269
    label52.insert(1.0,float(f2[0]))
270
271
    label53.delete(1.0,END)
272
    label53.insert(1.0,bytes.fromhex(hex(int(bine_in, 2))[2:]))
273
274
calc = tk.Button(
275
    command=hex_calc,
276
    text="HEX-Calc",
277
    width=12,
278
    font = ('Arial' , 14),
279
    bg="white",
280
    fg="Black",
281
)
282
calc.grid(row=0,column=5,padx=5, pady=5)
283
284
calc = tk.Button(
285
    command=hex_calc,
286
    text="Save2File",
287
    width=12,
288
    font = ('Arial' , 14),
289
    bg="white",
290
    fg="Black",
291
)
292
calc.grid(row=1,column=5,padx=5, pady=5)
293
294
window.mainloop()

von wer (Gast)


Lesenswert?

Indem du die Labels in eine Liste packst und über den Index ansprichst

von Micha (Gast)


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)


Lesenswert?

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

von Sheeva P. (sheevaplug)


Lesenswert?

Matthias schrieb:
>
1
> window = tk.Tk()
2
>

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:
1
import Tix as T
2
3
class mainWin(T.Tk):
4
    def __init__(self, *args, **kwargs):
5
        T.Tk.__init__(self, *args, **kwargs)
6
        self.exitBtn = T.Button(self, text='Exit', command=self.destroy)
7
        self.exitBtn.pack(side=T.TOP)
8
 
9
        for i in range(3):
10
            T.Button(self, text='X' + str(i), command=self.destroy).pack(side=T.TOP)
11
            
12
13
if __name__ == '__main__':
14
    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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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