我一直在制作一個 Enigma Machine 模擬器(帶有 的 python tkinter
),但由于某種原因,它絕對會占用我的 CPU,即使它不是一個大程式。我一直在想辦法優化它。我在 6 年級只上過 1 個 python 課pygame
,所以這都是我不熟悉的東西。幫助優化將不勝感激!此代碼只需粘貼到 IDLE 視窗即可作業。
"""
Enigma.py
Made by R.D. 2022
https://github.com/briocherockets
https://www.reddit.com/user/BriocheRockets
"""
# ROTOR VARIABLE GLOSSARY
# "rotorX1" 1,1,1 wiring, pre-slicing into lists and functions
# "rotorX" R1, R2, and R3 are procedural shuffled alphabets from sending the alphabet through the wiring functions
# "rotorXf" Wiring, stored as a function that 1-26 is sent through to be reassigned
# "rotorXtick" 1-26 tick variable
# LIBRARIES
import tkinter as tk
import sys
# WINDOW SETUP
window = tk.Tk()
window.title("Enigma")
window.geometry("700x550")
window.resizable(width=False, height=False)
# INPUT/OUTPUT BOXES
outputbox = tk.Text(window, height=6, width=75, font=("Calibri", 12))
inputbox = tk.Text(window, height=6, width=75, font=("Calibri", 12))
outputbox.place(x=50, y=50)
inputbox.place(x=50, y=380)
lettercount = 0
# ROTOR ROTATION DISPLAYS
rotor1box = tk.Text(window, height=1, width=2, font=("Calibri", 20))
rotor2box = tk.Text(window, height=1, width=2, font=("Calibri", 20))
rotor3box = tk.Text(window, height=1, width=2, font=("Calibri", 20))
rotor1box.place(x=80, y=255)
rotor2box.place(x=130, y=255)
rotor3box.place(x=180, y=255)
# TEMPORARY ROTOR VARIABLES (FOR STORAGE BEFORE CONVERSION INTO LIST
rotor11 = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"
rotor21 = "AJDKSIRUXBLHWTMCQGZNPYFVOE"
rotor31 = "BDFHJLCPRTXVZNYEIWGAKMUSQO"
ref1 = "YRUHQSLDPXNGOKMIEBFZCWVJAT"
alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# ROTOR LISTS
rotor1 = []
rotor2 = []
rotor3 = []
rotor1f = []
rotor2f = []
rotor3f = []
ref = []
numbers = list(range(1, 27))
# EXTRA VALUES
rotor1turnover = 17
rotor2turnover = 5
rotor3turnover = 22
rotor1tick = 1
rotor2tick = 1
rotor3tick = 1
rotors = [rotor1, rotor2, rotor3, ref, rotor1f, rotor2f, rotor3f]
rotorticks = [rotor1tick, rotor2tick, rotor3tick]
# SAVEWIRING SETUP
# TEXTBOXES
rot1 = tk.Text(window, height=1, width=26, font=("Consolas", 13))
rot2 = tk.Text(window, height=1, width=26, font=("Consolas", 13))
rot3 = tk.Text(window, height=1, width=26, font=("Consolas", 13))
refl = tk.Text(window, height=1, width=26, font=("Consolas", 13))
rot1.place(x=380, y=210)
rot2.place(x=380, y=240)
rot3.place(x=380, y=270)
refl.place(x=380, y=300)
# LABELS
alph = tk.Label(window, text="ABCDEFGHIJKLMNOPQRSTUVWXYZ", font=("Consolas", 13)).place(
x=379, y=180
)
r1t = tk.Label(window, text="Rotor 1:", font=("Consolas", 15)).place(x=260, y=210)
r2t = tk.Label(window, text="Rotor 2:", font=("Consolas", 15)).place(x=260, y=240)
r3t = tk.Label(window, text="Rotor 3:", font=("Consolas", 15)).place(x=260, y=270)
reft = tk.Label(window, text="Reflector:", font=("Consolas", 15)).place(x=260, y=300)
def save():
global rotor1
global rotor2
global rotor3
global ref
global rotors
rotor11 = rot1.get("1.0", "end")
rotor21 = rot2.get("1.0", "end")
rotor31 = rot3.get("1.0", "end")
ref1 = refl.get("1.0", "end")
rotor1 = []
rotor2 = []
rotor3 = []
ref = []
rotor1f = []
rotor2f = []
rotor3f = []
for i in range(0, 26):
rotor3.append(alpha.find(rotor31[i]) 1)
rotor2.append(alpha.find(rotor21[i]) 1)
rotor1.append(alpha.find(rotor11[i]) 1)
ref.append(alpha.find(ref1[i]) 1)
rotor3f.append(alpha.find(rotor31[i]) - i)
rotor2f.append(alpha.find(rotor21[i]) - i)
rotor1f.append(alpha.find(rotor11[i]) - i)
# print
# for i in range(0, 26):
# rotor1.append(rotor11[i])
# rotor2.append(rotor21[i])
# rotor3.append(rotor31[i])
# ref.append(ref1[i])
rotors = [rotor1, rotor2, rotor3, ref, rotor1f, rotor2f, rotor3f]
savewiring = tk.Button(
window,
text="Save Wiring",
font=("Calibri", 13),
command=save,
activebackground="Grey",
activeforeground="Grey",
)
savewiring.place(x=440, y=328)
# FINAL SETUPS
# TAKE STRINGS AND CONVERT TO LISTS
for i in range(0, 26):
rotor3.append(alpha.find(rotor31[i]) 1)
rotor2.append(alpha.find(rotor21[i]) 1)
rotor1.append(alpha.find(rotor11[i]) 1)
ref.append(alpha.find(ref1[i]) 1)
rotor3f.append(alpha.find(rotor31[i]) - i)
rotor2f.append(alpha.find(rotor21[i]) - i)
rotor1f.append(alpha.find(rotor11[i]) - i)
# INSERT VALUES TO BOXES
rot1.insert("1.0", "".join(map(str, rotor1)))
rot2.insert("1.0", "".join(map(str, rotor2)))
rot3.insert("1.0", "".join(map(str, rotor3)))
refl.insert("1.0", "".join(map(str, ref)))
# EEEEEEEEE
strip = ""
# ^dont remove or else it breaks everything lol
enigma = True # enigma balls lol
def change(rotor, reversebool):
global active
if rotor == 4:
active = ref[active - 1]
elif reversebool is True:
active = active (rotors[rotor 3])[active - 1]
if active > 26:
active -= 26
if active < 1:
active = 26
elif reversebool is False:
active = active - (rotors[rotor 3])[(rotors[rotor - 1]).index(active)]
if active > 26:
active -= 26
if active < 1:
active = 26
def encrypt():
change(3, True)
change(2, True)
change(1, True)
change(4, True)
change(1, False)
change(2, False)
change(3, False)
def rotincrement(rotor, reversebool):
global rotor1tick
global rotor2tick
global rotor3tick
global rotors
if reversebool is False:
temprot = (rotors[rotor 3])[0]
del (rotors[rotor 3])[0]
(rotors[rotor 3]).insert(25, temprot)
if rotorticks[rotor - 1] < 26:
rotorticks[rotor - 1] = 1
else:
rotorticks[rotor - 1] = 1
else:
temprot = (rotors[rotor 3])[25]
del (rotors[rotor 3])[25]
(rotors[rotor 3]).insert(0, temprot)
if rotorticks[rotor - 1] > 1:
rotorticks[rotor - 1] -= 1
else:
rotorticks[rotor - 1] = 26
for i in range(0, 26):
(rotors[rotor - 1])[i] = (rotors[rotor 3])[i] i 1
if (rotors[rotor - 1])[i] > 26:
(rotors[rotor - 1])[i] -= 26
elif (rotors[rotor - 1])[i] < 1:
(rotors[rotor - 1])[i] = 26
def rotate(count, reversebool):
global rotor1
global rotor2
global rotor3
global rotor1tick
global rotor2tick
global rotor3tick
# ROLL FORWARD
if reversebool is False:
rotincrement(3, False)
if rotorticks[2] == rotor3turnover:
rotincrement(2, False)
if rotorticks[1] == rotor2turnover:
rotincrement(1, False)
# ROLL BACKWARD
elif reversebool is True:
for i in range(1, count 1):
rotincrement(3, True)
if rotorticks[2] == rotor3turnover - 1:
rotincrement(2, True)
if rotorticks[1] == rotor2turnover - 1:
rotincrement(1, True)
# DEFINE BUTTONS FOR ROTOR SETTING
r1plus = tk.Button(
window,
text="?",
font=("Calibri", 12),
command=lambda: rotincrement(1, False),
activebackground="Grey",
activeforeground="Grey",
).place(x=80, y=200)
r2plus = tk.Button(
window,
text="?",
font=("Calibri", 12),
command=lambda: rotincrement(2, False),
activebackground="Grey",
activeforeground="Grey",
).place(x=130, y=200)
r3plus = tk.Button(
window,
text="?",
font=("Calibri", 12),
command=lambda: rotincrement(3, False),
activebackground="Grey",
activeforeground="Grey",
).place(x=180, y=200)
r1min = tk.Button(
window,
text="?",
font=("Calibri", 12),
command=lambda: rotincrement(1, True),
activebackground="Grey",
activeforeground="Grey",
).place(x=80, y=310)
r2min = tk.Button(
window,
text="?",
font=("Calibri", 12),
command=lambda: rotincrement(2, True),
activebackground="Grey",
activeforeground="Grey",
).place(x=130, y=310)
r3min = tk.Button(
window,
text="?",
font=("Calibri", 12),
command=lambda: rotincrement(3, True),
activebackground="Grey",
activeforeground="Grey",
).place(x=180, y=310)
"""
Main loop
"""
while enigma:
# UPDATE UI ROTORTICKS/USER INPUT
try:
rotor3box.delete("1.0", tk.END)
rotor3box.insert("1.0", rotorticks[2])
rotor2box.delete("1.0", tk.END)
rotor2box.insert("1.0", rotorticks[1])
rotor1box.delete("1.0", tk.END)
rotor1box.insert("1.0", rotorticks[0])
uinput = inputbox.get("1.0", tk.END)
except Exception:
sys.exit()
# LETTER COUNT UPDATE DETECTION
if lettercount != len(uinput):
if lettercount < len(uinput) and len(uinput) > 1:
if len(uinput) - lettercount > 1:
for i in range(1, len(uinput) - lettercount 1):
active = alpha.find(uinput[i - 1].upper()) 1
rotate(1, False)
encrypt()
outputbox.insert(tk.END, alpha[active - 1])
else:
active = alpha.find(uinput[len(uinput) - 2].upper()) 1
rotate(1, False)
encrypt()
outputbox.insert(tk.END, alpha[active - 1])
elif lettercount > len(uinput):
if lettercount - len(uinput) < 2:
rotate(1, True)
uoutput = outputbox.get("1.0", tk.END)
strip = uoutput[:-2]
outputbox.delete("1.0", tk.END)
outputbox.insert("1.0", strip)
else:
rotate(lettercount - len(uinput), True)
uoutput = outputbox.get("1.0", tk.END)
strip = uoutput[: ((lettercount - len(uinput)) * -1) - 1]
outputbox.delete("1.0", tk.END)
outputbox.insert("1.0", strip)
# UPDATE ROTOR WIRING BOXES
rot1.delete("1.0", tk.END)
rot1.insert("1.0", "".join(map(str, rotor11)))
rot2.delete("1.0", tk.END)
rot2.insert("1.0", "".join(map(str, rotor21)))
rot3.delete("1.0", tk.END)
rot3.insert("1.0", "".join(map(str, rotor31)))
refl.delete("1.0", tk.END)
refl.insert("1.0", "".join(map(str, ref1)))
# REDEFINE LETTERCOUNT
lettercount = len(uinput)
window.update()
uj5u.com熱心網友回復:
基本上,您自己撰寫的方式使 CPU 保持不變,因為您的-loopmainloop
中沒有暫停。while
一個快速的解決方法是將例如添加time.sleep(0.05)
到您的回圈中。
但更好的解決方案是以規范的方式重寫它。當您按下一個鍵時,原始的謎機會進行“計算”。因此,將計算與關鍵事件聯系起來是有意義的。
使用標準mainloop
, 和bind
函式來更新<Key>
事件的加密。
def handle_key(event):
try:
rotor3box.delete("1.0", END)
rotor3box.insert("1.0", rotorticks[2])
rotor2box.delete("1.0", END)
rotor2box.insert("1.0", rotorticks[1])
rotor1box.delete("1.0", END)
rotor1box.insert("1.0", rotorticks[0])
uinput = event.char
except:
sys.exit()
# LETTER COUNT UPDATE DETECTION
if lettercount != len(uinput):
if lettercount < len(uinput) and len(uinput) > 1:
if len(uinput) - lettercount > 1:
for i in range(1, len(uinput) - lettercount 1):
active = alpha.find(uinput[i - 1].upper()) 1
rotate(1, False)
encrypt()
outputbox.insert(END, alpha[active - 1])
else:
active = alpha.find(uinput[len(uinput) - 2].upper()) 1
rotate(1, False)
encrypt()
outputbox.insert(END, alpha[active - 1])
elif lettercount > len(uinput):
if lettercount - len(uinput) < 2:
rotate(1, True)
uoutput = outputbox.get("1.0", END)
strip = uoutput[:-2]
outputbox.delete("1.0", END)
outputbox.insert("1.0", strip)
else:
rotate(lettercount - len(uinput), True)
uoutput = outputbox.get("1.0", END)
strip = uoutput[: ((lettercount - len(uinput)) * -1) - 1]
outputbox.delete("1.0", END)
outputbox.insert("1.0", strip)
# UPDATE ROTOR WIRING BOXES
rot1.delete("1.0", END)
rot1.insert("1.0", "".join(map(str, rotor11)))
rot2.delete("1.0", END)
rot2.insert("1.0", "".join(map(str, rotor21)))
rot3.delete("1.0", END)
rot3.insert("1.0", "".join(map(str, rotor31)))
refl.delete("1.0", END)
refl.insert("1.0", "".join(map(str, ref1)))
# REDEFINE LETTERCOUNT
lettercount = len(uinput)
window.bind("<Key>", handle_key)
window.mainloop()
在此示例中,我將其系結到根視窗。您可能希望將其系結到輸入視窗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486919.html