分享一个tkinter和虚拟机作品

分享一个tkinter和虚拟机作品


库以及系统要求:
1.python3.6.8
2.pillow
3.Windows10(最好)

下面是一小段虚拟机部分(还有自定义模块没有展示)完整源码见文末链接:

import os
import tkinter as tk
import time
from sys import exit
from PIL import Image, ImageTk

try:
    from .built.SPT import *
    from .built.builtin_func import *
    from .built.tclass import *
except ImportError:
    from built.SPT import *
    from built.builtin_func import *
    from built.tclass import *


def operator(opera, condit):  # 运算符号,指令
    """运算符"""
    if opera not in Avm.oper:
        Avm.senderror("SyntaxError:%s is not defined." % opera)
        return None

    condit1 = run(strip_code(condit[: condit.index(opera)]), strip=False)
    condit2 = run(strip_code(condit[condit.index(opera) + len(opera):]), strip=False)

    # 强制类型转化
    try:
        condit2 = Avm.pytype[type(condit1).__name__](condit2)
    except KeyError:
        # 无法找到对应类型
        Avm.senderror("TypeError:type\"%s\" is not defined.\n" % opera)
    except ValueError:
        # 无法转化类型
        Avm.senderror("TypeError:type\"%s\" couldn\'n be %s.\n" % (condit2, type(condit1).__name__))

    if opera == '==':
        return run(condit1) == run(condit2)
    if opera == '!=':
        return run(condit1) != run(condit2)
    if opera == '>':
        return run(condit1) > run(condit2)
    if opera == '>':
        return run(condit1) < run(condit2)
    if opera == '>':
        return run(condit1) <= run(condit2)
    if opera == '>':
        return run(condit1) >= run(condit2)


class AVM:
    """虚拟机类"""
    # 指令
    codes = []
    # 变量
    addr = {}
    # 运算符
    oper = [
        "==",
        "!=",
        ">=",
        "<=",
        ">",
        "<"
    ]
    typed = {
        "int": aint,
        "string": string,
        "float": afloat
    }
    #类型转化
    pytype = {
        "int": lambda typed: int(typed),
        "str": lambda typed: typed,
        "float": lambda typed: float(typed),
    }
    # 自定义函数
    func_def = {}
    # 程序计数器
    code_num = 0

    def __init__(self):
        self.tree = {
            "if": self.ifif,
            "while": self.con_while,
            "func": self.func,
        }
        self.code = {
            "=": self.valueasas,
        }

        # 内置函数
        self.func_dict = {
            "add": add,
            "exit": self.quit,
            "mul": mul,
            "print": self.printr,
            "div": div,
            "sub": sub,
            "del": self.delvalue,
        }

    def addvalue(self, name, value, vartype):
        # 添加变量
        try:
            fin_value = self.typed[vartype]()
            fin_value.set(value)  # 最终值
            self.addr[name] = (vartype, fin_value)
        except KeyError:
            self.senderror('TypeError:aloud doesn\'t have \"%s\"type.' % vartype)

    def setvalue(self, name, value):
        try:
            self.addr[name][1].set(value)
        except KeyError:
            self.senderror('NameError:%s is not defined' % name)

    def push(self, code):
        self.codes.append(code)

    def leave(self):
        self.window.update()
        re = self.codes[self.code_num]
        self.code_num += 1
        return re

    def valueasas(self, codea):
        codea = strip_code(codea)
        name = strip_code(
            codea[codea.index(" ") + 1: codea.index("=")], del_=" ")
        value = run(strip_code(codea[codea.index("=") + 1:]), strip=False)
        vartype = codea[: codea.index(" ")]

        if value is not None:
            self.addvalue(name, value, vartype)
        else:
            self.senderror("NameError:\'%s\'' is not defined.\n\n" % value)

    def printr(self, strs):
        print_text = ""
        strs = [str(i) for i in strs]
        for i in strs:
            print_text += run(i)
            self.window.update()
        self.text.insert("end", print_text + "\n")

    def delvalue(self, name):
        # 删除变量
        try:
            for i in name:
                del self.addr[i]
        except KeyError as e:
            raise e
            self.senderror("NameError:Could'n del \"%s\"\n\n" % i)

    def file_window(self):
        self.window = tk.Toplevel()
        self.window.title("Aloud")
        self.window.geometry("710x500")
        image = Image.open(os.path.join(os.path.dirname(__file__), "img\\Aloud.png"))
        imagetk = ImageTk.PhotoImage(image)
        image.close()
        self.window.iconphoto(False, imagetk)

        enter_button = tk.Button(self.window, font=(14,), width=2, height=1)
        self.text = tk.Text(
            self.window,
            bg="black",
            fg="white",
            font=("Arial", 14),
            insertbackground="white",
            insertborderwidth=1,
            width=90,
            height=22,
        )
        enter_button.place(x=100, y=0)
        self.text.place(x=0, y=0)

        self.scroll = tk.Scrollbar(self.window)
        # 放到窗口的右侧, 填充Y竖直方向
        self.scroll.pack(side="right", fill="y")
        # 两个控件关联
        self.scroll.config(command=self.text.yview)
        self.text.config(yscrollcommand=self.scroll.set)

    def quit(self, codes):  # 参数是为了接受列表
        self.clear()
        self.window.destroy()


    def ifif(self, condit, codes):
        """条件分支"""
        if run_oper(condit):
            for i in codes:
                run(i)

    def func(self, name, codes):
        self.func_def[name] = codes

    def con_while(self, condit, codes):
        """条件循环"""
        while run_oper(condit):
            for i in codes:
                run(i)

    def senderror(text):
        self.text.insert("end", "Error:Line %s" % (self.code_num+1))
        self.text.insert("end", text)


def getfunc_num(num):
    """获取参数"""
    num_str = num[num.index("(") + 1: num.index(")")]
    numlist = num_str.split(",")  # 返回参数列表
    relist = []
    for i in numlist:
        num = run(i)
        relist.append(num)
    return relist


def block(codes):
    """获取语句块"""
    pass


def run(runc=None, strip=True):
    # 执行引擎
    if runc is None:
        runc = str(Avm.leave())
        if strip:
            runcode = strip_code(runc)
        else:
            runcode = runc
    else:
        runcode = strip_code(str(runc))

    if "#" == runcode[0]:
        run_value(runcode)
        return None

    if "{" == runcode[-1]:
        # 需要找到的}数
        quit_num = 1
        # 指令列表
        tabcodes = []
        while 1:
            # 加入列表的指令
            addcode = Avm.leave()
            tabcodes.append(addcode)
            try:
                # 碰到了新的{
                if addcode[-1] == "{":
                    quit_num += 1
                if addcode[-1] == "}":
                    quit_num -= 1
                    if quit_num == 0:
                        break
            except IndexError:
                pass

        for i in Avm.tree:
            if i in runcode:
                Avm.tree[i](runcode[runcode.index(
                    "(") + 1: runcode.index(")")], tabcodes)  # 如if后的条件
        return None

    elif ("(" in runcode) and (")" in runcode):
        return run_func(runcode)

    return run_type(runc)


def run_oper(code):
    """运算符表达式"""
    for i in Avm.oper:
        if i in code:
            return operator(i, code)


def run_value(code):
    """变量"""
    for i in Avm.code:
        if i in code:
            Avm.code[i](code[1:])
            break
    return None


def run_type(code):
    """负责数据类型和取出变量值"""
    try:
        return Avm.addr[code][1].value
    except KeyError:
        return ftype(str(code))


def run_func(code):
    """执行函数"""
    function = code[: code.index("(")]  # 函数名
    if function in Avm.func_dict:
        # 内置函数
        num = getfunc_num(code)  # 参数
        return Avm.func_dict[function](num)
    elif function in Avm.func_def:
        # 自定义函数
        for i in Avm.func_def[function]:
            run(i)
    else:
        Avm.senderror("NameError:%s is not defined" % function)


def open_text(oc, path):  # 是不是处理后文件
    # 打开文件
    try:
        avm = open(path, encoding="UTF-8")
    except FileNotFoundError:
        oc.senderror("OpenFileError:Cound'n open'%s'\n" % path)
    else:
        avmr = avm.readlines()
        avmw = []
        for i in avmr:
            writecode = strip_code(i)
            if writecode != "":
                try:
                    if writecode[0:2] != "\\\\":
                        avmw.append(writecode)
                except IndexError:
                    pass
    
        oc.codes = avmw
    

def make_Avm(path):
    global Avm
    Avm = AVM()
    open_text(oc=Avm, path=path)
    Avm.file_window()

    end_code = len(Avm.codes)

    starttime = time.clock()
    while end_code != Avm.code_num:
        run()
    endtime = time.clock()
    Avm.text.insert('end', "Finished in %s seconds" % str(endtime - starttime))
    del Avm

https://pan.baidu.com/s/1jB_1COw8Shkfb3XxrxcQGQ
提取码:1v3a

上一篇:tkinter+socket 库初步实现聊天服务端,运行效率奇低,仅供参考


下一篇:Python tkinter之Frame(容器)