import tkinter from Print import Print_line from ALU import ALU from Clock import * from SIG_ctrl import SIG from memory import MEM #初始化 cl = ClockStep() alu = ALU() si = SIG() mem = MEM() line = Print_line() def init(cv:Canvas): cl.init(cv, root) alu.init(cv, root) si.init(cv, root) mem.show(cv, root) line.init() init(cv) class RightPanel: def R_set(self, num): result = tkinter.simpledialog.askstring(title='修改R' + str(num + 1), prompt='请输入修改后的R值:', initialvalue=cpu.R(num))#显示输入提示 if not result:#若没有输入则直接返回 return if not len(result) == len(cpu.R(num)):#输入错误则警告 messagebox.showwarning('警告', 'R值不合法') return for i in range(16):#输入错误则警告 if (not result[i] == '0' and not result[i] == '1'): messagebox.showwarning('警告', 'R值不合法') return sum = 0#计算输入的值 for i in range(16): sum *= 2 sum += int(result[i]) cpu.R_int[num] = sum# 修改相应寄存器的值 self.CAL_display()#重新显示面板 alu.init(cv, root)#修改仿真界面 cv.update()#更新画布 def op_set(self, num): cpu.alu = num#修改cpu记录中的符号 if num == 1:#修改为+ alu.opa(cv) elif num == 2:#修改为- alu.opb(cv) elif num == 3:#修改为* alu.opc(cv) elif num == 4:#修改为/ alu.opd(cv) else:#修改为空 alu.no(cv) self.CAL_display()#重新显示面板 def MEM_display(self):# 存储器操作面板 for w in root_right.winfo_children(): w.destroy()# 清除所有组件 # 显示标题 lab = tk.Label(root_right, text="存储器", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.15, rely=0.02, width=200, height=30) y0 = 0.1 # 显示Mcontent与更改按钮 lab = tk.Label(root_right, text="当前Mcontent:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) lab.place(relx=0.1, rely=0.05 + y0, width=120, height=30) lab2 = tk.Label(root_right, text=cpu.MCO(), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.1, rely=0.1 + y0, width=200, height=30) B = tk.Button(root_right, text="更改", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), command=lambda: self.MCO_set()) B.place(relx=0.7, rely=0.05 + y0, width=50, height=30) # 显示Maddr与更改按钮 lab = tk.Label(root_right, text="当前Maddr:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) lab.place(relx=0.1, rely=0.15 + y0, width=120, height=30) lab2 = tk.Label(root_right, text=cpu.MAD(), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.1, rely=0.2 + y0, width=200, height=30) B = tk.Button(root_right, text="更改", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), command=lambda: self.MAD_set()) B.place(relx=0.7, rely=0.15 + y0, width=50, height=30) # 逐个设置存储单元按钮 B = tk.Button(root_right, text="设置存储器", command=lambda: self.set_memory()) B.place(relx=0.1, rely=0.2 + y0, width=200, height=30) # 装载一段程序按钮 B = tk.Button(root_right, text="装载一段程序", command=lambda: self.write_memory()) B.place(relx=0.1, rely=0.25 + y0, width=200, height=30) def CAL_display(self): # 运算器操作面板 for w in root_right.winfo_children(): w.destroy() # 清除右侧组件 lab = tk.Label(root_right, text="运算器", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.15, rely=0.02, width=200, height=30) y0 = 0.1 # 显示运算符与更改按钮 PC = tk.Label(root_right, text="当前运算:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) PC.place(relx=0.1, rely=0.05 + y0, width=80, height=30) lab2 = tk.Label(root_right, text=cpu.ALU(), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.5, rely=0.05 + y0, width=20, height=30) lab2 = tk.Label(root_right, text="更改运算符", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) lab2.place(relx=0.1, rely=0.1 + y0, width=120, height=30) B = tk.Button(root_right, text='+', command=lambda: self.op_set(1), state=NORMAL) # 更改为+ B.place(relx=0.05 + 0 * 0.15, rely=0.15 + y0, relwidth=0.15, relheight=0.05) B = tk.Button(root_right, text='-', command=lambda: self.op_set(2), state=NORMAL) # 更改为- B.place(relx=0.05 + 1 * 0.15, rely=0.15 + y0, relwidth=0.15, relheight=0.05) B = tk.Button(root_right, text='x', command=lambda: self.op_set(3), state=NORMAL) # 更改为* B.place(relx=0.05 + 2 * 0.15, rely=0.15 + y0, relwidth=0.15, relheight=0.05) B = tk.Button(root_right, text='÷', command=lambda: self.op_set(4), state=NORMAL) # 更改为/ B.place(relx=0.05 + 3 * 0.15, rely=0.15 + y0, relwidth=0.15, relheight=0.05) B = tk.Button(root_right, text='无', command=lambda: self.op_set(0), state=NORMAL) # 更改为无 B.place(relx=0.05 + 4 * 0.15, rely=0.15 + y0, relwidth=0.15, relheight=0.05) R_text = [] for i in range(4): # 读取寄存器的值 R_text.append(cpu.R(i)) for i in range(4): # 显示各个寄存器的值与更改按钮 RN = tk.Label(root_right, text="R" + str(i + 1) + ':', bg=WHITE, fg=BLACK, font=('微软雅黑', 12)) RN.place(relx=0.05, rely=0.2 + y0 + 0.1 * i, width=80, height=30, anchor=NW) lab1 = tk.Label(root_right, text=R_text[i], bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab1.place(relx=0.1, rely=0.25 + y0 + 0.1 * i, width=150, height=30, anchor=NW) B = tk.Button(root_right, text='设置R' + str(i + 1), command=lambda num=i: self.R_set(num), state=NORMAL) B.place(relx=0.3, rely=0.2 + y0 + 0.1 * i, relwidth=0.2, relheight=0.05) def SIG_display(self):#控制器操作面板 for w in root_right.winfo_children(): w.destroy()# 清除右侧组件 lab = tk.Label(root_right, text="控制器", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.15, rely=0.02, width=200, height=30) y0 = 0.1 # 显示PC值与更改按钮 PC = tk.Label(root_right, text="当前PC:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) PC.place(relx=0.1, rely=0.05 + y0, width=80, height=30) lab2 = tk.Label(root_right, text=cpu.PC(), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.1, rely=0.1 + y0, width=200, height=30) B = tk.Button(root_right, text="设置PC值", command=lambda: self.pc_set()) B.place(relx=0.5, rely=0.05 + y0, width=80, height=30) # 显示IR值与更改按钮 IR = tk.Label(root_right, text="当前IR:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) IR.place(relx=0.1, rely=0.15 + y0, width=80, height=30) lab2 = tk.Label(root_right, text=cpu.IR(), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.1, rely=0.2 + y0, width=200, height=30) B = tk.Button(root_right, text="设置IR值", command=lambda: self.ir_set()) B.place(relx=0.5, rely=0.15 + y0, width=80, height=30) # 显示CLOCK与更改按钮 CLO = tk.Label(root_right, text="当前时钟:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) CLO.place(relx=0.1, rely=0.25 + y0, width=80, height=30) lab2 = tk.Label(root_right, text=str(cpu.clostep + 1), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.45, rely=0.25 + y0, width=50, height=30) lab = tk.Label(root_right, text="设置时钟刻:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12)) lab.place(relx=0.1, rely=0.3 + y0, width=150, height=30) for i in range(6):#遍历时钟刻 if cpu.clostep == i:#若是当前时钟刻则高亮显示,按钮禁用 B = tk.Button(root_right, text=str(i + 1), command=lambda n=i: self.clo_set(n), bg=YELLOW, state=DISABLED) else:#若不是当前时钟刻则正常显示,按钮启用 B = tk.Button(root_right, text=str(i + 1), command=lambda n=i: self.clo_set(n), state=NORMAL) B.place(relx=0.05 + i * 0.15, rely=0.35 + y0, relwidth=0.15, relheight=0.05) # 显示Inscode与更改按钮 INS = tk.Label(root_right, text="当前Inscode:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=W) INS.place(relx=0.1, rely=0.4 + y0, width=130, height=30) lab2 = tk.Label(root_right, text=cpu.CODE(), bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab2.place(relx=0.1, rely=0.45 + y0, width=100, height=30) B = tk.Button(root_right, text="设置Inscode", command=lambda: self.code_set()) B.place(relx=0.55, rely=0.45 + y0, width=80, height=30) def write_memory(self): init(cv) top = tk.Toplevel() top.title('载入程序') width = 1000 height = 700 top.geometry(f'{width}x{height}') top.config(bg=WHITE) lab = tk.Label(top, text="载入程序,用逗号隔开指令", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.05, rely=0.05, relwidth=0.4, relheight=0.1) E = tk.Text(top, bg=GREY, fg=BLACK, font=('微软雅黑', 12)) E.place(relx=0.05, rely=0.15, relheight=0.6, relwidth=0.4) B = tk.Button(top, text="载入程序", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), command=lambda: get_text()) B.place(relx=0.05, rely=0.75, relwidth=0.4, relheight=0.05) user = E.get(1.0, 'end') user_command = [] user.replace(' ', '') user.replace('\n', '') t = list(user) for i in range(len(t)): if t[i] == ',': t[i] = ',' elif not t[i] == '0' and not t[i] == '1' and not t[i] == ',': t[i] = '' user = ''.join(t) users = user.split(',') # print(users) for u in users: if len(u) == 16: user_command.append(u) # print(user_command) lab = tk.Label(top, text="程序载入预览", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.55, rely=0.05, relwidth=0.4, relheight=0.1) u_text = '' for u in user_command: u_text += u u_text += '\n' L = tk.Label(top, text=u_text, bg=GREY, fg=BLACK, font=('微软雅黑', 12)) L.place(relx=0.55, rely=0.15, relheight=0.6, relwidth=0.4) B = tk.Button(top, text="确认载入程序", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), command=lambda: write()) B.place(relx=0.55, rely=0.75, relwidth=0.4, relheight=0.05) def w_init(): for w in top.winfo_children(): w.destroy() # 清除原有组件 lab = tk.Label(top, text="载入程序,用逗号隔开指令", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.05, rely=0.05, relwidth=0.4, relheight=0.1) E = tk.Text(top, bg=GREY, fg=BLACK, font=('微软雅黑', 12)) E.place(relx=0.05, rely=0.15, relheight=0.6, relwidth=0.4) B = tk.Button(top, text="载入程序", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), command=lambda: get_text()) B.place(relx=0.05, rely=0.75, relwidth=0.4, relheight=0.05) def get_text(): # L.destroy() user = E.get(1.0, 'end') user_command = [] user.replace(' ', '') user.replace('\n', '') t = list(user) for i in range(len(t)): if t[i] == ',': t[i] = ',' elif not t[i] == '0' and not t[i] == '1' and not t[i] == ',': t[i] = '' user = ''.join(t) users = user.split(',') # print(users) for u in users: if len(u) == 16: user_command.append(u) # print(user_command) # lab = tk.Label(top, text="程序载入预览", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) # lab.place(relx=0.55, rely=0.05, relwidth=0.4, relheight=0.1) u_text = '' i = 0 for u in user_command: u_text += bin(i).replace('0b', '').zfill(16) u_text += ' ' u_text += u u_text += '\n' i += 1 L = tk.Label(top, text=u_text, bg=GREY, fg=BLACK, font=('微软雅黑', 12), anchor=N) L.place(relx=0.55, rely=0.15, relheight=0.6, relwidth=0.4) def write(): user = E.get(1.0, 'end') user_command = [] user.replace(' ', '') user.replace('\n', '') t = list(user) for i in range(len(t)): if t[i] == ',': t[i] = ',' elif not t[i] == '0' and not t[i] == '1' and not t[i] == ',': t[i] = '' user = ''.join(t) users = user.split(',') # print(users) for u in users: if len(u) == 16: user_command.append(u) # print(user_command) for i in range(20): cpu.SimMem[i] = bin(0).replace('0b', '').zfill(16) for i in range(len(user_command)): cpu.SimMem[i] = user_command[i] mem.show(cv, root) top.destroy() def set_memory(self): init(cv) top = tk.Toplevel() top.title('编辑存储器') width = 500 height = 600 top.geometry(f'{width}x{height}') top.config(bg=WHITE) Texts = [] def show(): for w in top.winfo_children(): w.destroy() # 清除原有组件 Texts.clear() lab = tk.Label(top, text="设置存储器", bg=WHITE, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.25, rely=0.02, width=200, height=30) y0 = 50 lab = tk.Label(top, text="当前存储器:", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=CENTER) lab.place(y=y0, width=120, height=30) for i in range(20): lab = tk.Label(top, text="00000000 " + bin(i).replace('0b', '').zfill(8), bg=WHITE, fg=BLACK, font=('微软雅黑', 12), anchor=CENTER) lab.place(x=30, y=30 + y0 + i * 20, width=180, height=20) text = tkinter.Entry(top, bg=GREY, fg=BLACK, font=('微软雅黑', 12), bd=2) text.place(x=200, y=30 + y0 + i * 20, width=180, height=20) text.insert(0, cpu.SimMem[i]) Texts.append(text) B = tk.Button(top, text="设置Memory", bg=WHITE, fg=BLACK, font=('微软雅黑', 12), command=lambda: set_mem()) B.place(x=100, y=450 + y0, width=280, height=20) show() def set_mem(): for T in Texts: txt = T.get() # print(txt) if not len(txt) == len(cpu.SimMem[0]): messagebox.showwarning('警告', '修改不合法') show() return for l in range(len(txt)): if (not txt[l] == '0') and (not txt[l] == '1'): messagebox.showwarning('警告', '修改不合法') show() return i = 0 for T in Texts: txt = T.get() # print (Texts[i].get()) cpu.SimMem[i] = txt i += 1 show() mem.show(cv, root) def SIG_info(self): pass def MCO_set(self): result = tkinter.simpledialog.askstring(title='修改Mcontent', prompt='请输入修改后的Mcontent:', initialvalue=cpu.MCO()) if not result: return if not len(result) == len(cpu.MCO()): messagebox.showwarning('警告', 'Mcontent不合法') return for i in range(8): if (not result[i] == '0' and not result[i] == '1') or (not result[i + 9] == '0' and not result[i + 9] == '1'): messagebox.showwarning('警告', 'Mcontent不合法') return sum = 0 for i in range(8): sum *= 2 sum += int(result[i]) for i in range(8): sum *= 2 sum += int(result[i + 9]) # 将更改后的的值放到Mcontent中 cpu.MCO_int = sum self.MEM_display() mem.show(cv, root) cv.update() def MAD_set(self): result = tkinter.simpledialog.askstring(title='修改Maddr', prompt='请输入修改后的Maddr:', initialvalue=cpu.MAD()) if not result: return if not len(result) == len(cpu.MAD()): messagebox.showwarning('警告', 'Maddr不合法') return for i in range(8): if (not result[i] == '0' and not result[i] == '1') or ( not result[i + 9] == '0' and not result[i + 9] == '1'): messagebox.showwarning('警告', 'Maddr不合法') return sum = 0 for i in range(8): sum *= 2 sum += int(result[i]) for i in range(8): sum *= 2 sum += int(result[i + 9]) cpu.MAD_int = sum self.MEM_display() mem.show(cv, root) cv.update() def code_set(self): result = tkinter.simpledialog.askstring(title='修改Inscode', prompt='请输入修改后的Inscode:', initialvalue=cpu.CODE()) if not result: return if not len(result) == len(cpu.CODE()): messagebox.showwarning('警告', 'Inscode不合法') return for i in range(6): if (not result[i] == '0' and not result[i] == '1'): messagebox.showwarning('警告', 'Inscode不合法') return sum = 0 for i in range(6): sum *= 2 sum += int(result[i]) # 修改INSCODE值 cpu.code = sum self.SIG_display() si.init(cv, root) cv.update() def pc_set(self): result = tkinter.simpledialog.askstring(title='修改PC值', prompt='请输入修改后的PC值:', initialvalue=cpu.PC()) if not result: return if not len(result) == len(cpu.PC()): messagebox.showwarning('警告', 'PC值不合法') return for i in range(8): if (not result[i] == '0' and not result[i] == '1') or (not result[i + 9] == '0' and not result[i + 9] == '1'): messagebox.showwarning('警告', 'PC值不合法') return sum = 0 for i in range(8): sum *= 2 sum += int(result[i]) for i in range(8): sum *= 2 sum += int(result[i + 9]) cpu.PC_int = sum self.SIG_display() cv.update() def ir_set(self): result = tkinter.simpledialog.askstring(title='修改IR值', prompt='请输入修改后的IR值:', initialvalue=cpu.IR()) if not result: return if not len(result) == len(cpu.IR()): messagebox.showwarning('警告', 'IR值不合法') return for i in range(8): if (not result[i] == '0' and not result[i] == '1') or (not result[i + 9] == '0' and not result[i + 9] == '1'): messagebox.showwarning('警告', 'IR值不合法') return sum = 0 for i in range(8): sum *= 2 sum += int(result[i]) for i in range(8): sum *= 2 sum += int(result[i + 9]) cpu.IR_int = sum self.SIG_display() cv.update() def clo_set(self, clo): cpu.CLO(clo) self.SIG_display() if __name__ == "__main__": r = RightPanel()#实例化类 r.MEM_display()#显示存储器操作面板 # r.CAL_display() # r.SIG_display() # r.set_memory() # r.write_memory() # init(cv) root.mainloop()