Python 动物专家识别系统

from tkinter import *
import copy

def find_data(process_data_list):
    # 依次进行循环查找并对过程排序
    #print(data_process_list)
    #print(data_result_list)
    #print(dict_input)
    for p, data_process in enumerate(data_process_list):
        # 用于判断此过程是否成立
        count = 0
        #print(process_data_list)
        #print(data_process)
        for i in process_data_list:
            if i in data_process:
                #print(i+'1')
                count += 1
        # 过程成立则数值相同,可以进入下一步
        if count == len(data_process):
            # 此过程中结果是否为最终结果,不是将此过程结果加入到过程中
            if data_result_list[p] not in result_list:
                # 弹出过程和此过程结果,因为此过程已经进行过,此结果存入需要查找的过程中
                result = data_result_list.pop(p)
                process = data_process_list.pop(p)
                #ins1(result,process)
                # 判断结果是否已经存在过程中,存在则重新寻找,不存在则加入过程,并将其存入最终结果
                if result not in process_data_list:
                    dict_input[','.join(process)] = result
                    end_result = find_data(process_data_list + [result])
                    if end_result == 1:
                        return 1
                    else:
                        return 0
                # 存在则直接寻找
                else:
                    end_result = find_data(process_data_list)
                    if end_result == 1:
                        return 1
                    else:
                        return 0
            # 找到最终结果,取出结果后返回
            else:
                process = data_process_list.pop(p)
                dict_input[','.join(process)] = data_result_list[p]
                return 1
    return 0
def ini1(data_process_list, data_result_list):
    Lstbox1.delete(0, END)
    for item in data_process_list:
        Lstbox1.insert(END, item)
    Lstbox2.delete(0, END)
    for item in data_result_list:
        Lstbox2.insert(END, item)


def clear():
    Lstbox1.delete(0, END)
    Lstbox2.delete(0, END)
    txt.delete(1.0,END)


def ins1(x,y):
    Lstbox1.insert(Lstbox1.size(),x)
    Lstbox2.insert(Lstbox2.size(),y)

def ins():
    if entry.get() != '':
        if Lstbox1.curselection() == ():
            Lstbox1.insert(Lstbox1.size(), entry.get())
        else:
            Lstbox1.insert(Lstbox1.curselection(), entry.get())
        s = entry.get()
        global data_process_list
        data_process_list.append(s)


def ins2():
    if entry.get() != '':
        if Lstbox2.curselection() == ():
            Lstbox2.insert(Lstbox2.size(), entry.get())
            # s = entry.get()
            # t = Lstbox2.size()
            # global data_result_list
            # data_result_list[t] = s
        else:
            Lstbox2.insert(Lstbox2.curselection(), entry.get())
            # s = entry.get()
            # t = Lstbox2.curselection()
            # global data_result_list
            # data_result_list[t] = s
        s = entry.get()
        global data_result_list
        data_result_list.append(s)


def updt():
    if entry.get() != '' and Lstbox1.curselection() != ():
        selected = Lstbox1.curselection()[0]
        Lstbox1.delete(selected)
        Lstbox1.insert(selected, entry.get())
        s1 = entry.get()
        global data_process_list
        data_process_list[selected] = s1
        s = '你已经成功修改'
        gettt(s)

def updt1():
    if entry.get() != '' and Lstbox2.curselection() != ():
        selected = Lstbox2.curselection()[0]
        Lstbox2.delete(selected)
        Lstbox2.insert(selected, entry.get())
        s1 = entry.get()
        global data_result_list
        data_result_list[selected]=s1
        s = '你已经成功修改'
        gettt(s)



def delt():
    if Lstbox1.curselection() != ():
        t = list(Lstbox1.curselection())
        Lstbox1.delete(Lstbox1.curselection())
        Lstbox2.delete(t)
        t1 = Lstbox1.curselection()
        global data_process_list
        del data_process_list[t1]
        global data_result_list
        del data_result_list[t1]
        s='你已经成功删除'
        gettt(s)

def gettt(s):
    txt.delete(1.0,END)
    txt.insert(END, s)


def plus():
    term=entry.get()
    #print(term)
    if term=='0':
        entry.delete(0,'end')
        #print(list_data)
        global data_result_list
        tdataq_result_list=data_result_list.copy()
        global dict_input
        dict_input.clear()
        global data_process_list
        tdata_process_list=data_process_list.copy()
        end_result = find_data(list_data)
        data_result_list=tdataq_result_list
        data_process_list=tdata_process_list
        print(data_result_list)
        print(dict_input)
        print(end_result)
        if end_result == 1:
            s='推理:'+'\n'
            s3='综合数据库:'
            s3 = s3 + ' '.join(list_data) + ' '
            # 将结果进行打印
            for i in dict_input.keys():

                if dict_input[i] not in result_list:
                    s3 = s3 + dict_input[i] + ' '
                s1=i+'-->'+dict_input[i]+'\n'
                s=s+s1
                #print(s)
                #print(f"{i}->{dict_input[i]}")
                # 得到最终结果即输出所识别动物
                if dict_input[i] in result_list:
                    s2='所识别的动物为'+dict_input[i]+'\n'
                    s=s+s2
            s=s3+'\n'+s
            gettt(s)
        else:
            # 将结果进行打印
            s3 = '综合数据库:'
            s3 = s3 + ' '.join(list_data) + ' '

            for i in dict_input.keys():
                s1='推理:'

                if dict_input[i] not in result_list:
                    s3 = s3 + dict_input[i] + ' '

                s=i+'->'+dict_input[i]+'\n'+'并未得出最终结论,请继续补充事实'
                s=s3+'\n'+s1+s
                #print(s)
                gettt(s)


    if term:
            if database[term] not in list_data:
                list_data.append(database[term])
    else:
        s='输入为空'
        gettt(s)
    entry.delete(0,'end')
    # 打印前提条件
    s='前提条件为:'
    s1=' '.join(list_data) + '\n'
    s1=s+s1
    gettt(s1)
    # 进行递归查找,直到找到最终结果,返回1则找到最终结果


# 用于储存中间过程
global data_process_list
data_process_list = []
# 用于存储过程对应的结果
global data_result_list
data_result_list = []
# 存储用于查询的数据
global list_data
list_data = []
# 用于存储输出结果
global dict_input
dict_input = {}
#做一个联系
dict1={}
# 规则库
txt = '''有毛发,是哺乳动物
有奶,是哺乳动物
有羽毛,是鸟
会飞,会下蛋,是鸟
吃肉,是肉食动物
有犬齿,有爪,眼盯前方,是食肉动物
是哺乳动物,有蹄,是蹄类动物
是哺乳动物,是咀嚼反刍动物,是蹄类动物
是哺乳动物,是肉食动物,是黄褐色,身上有暗斑点,金钱豹
是哺乳动物,是肉食动物,是黄褐色,身上有黑色条纹,虎
是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
是蹄类动物,身上有黑色条纹,斑马
是鸟,有长脖子,有长腿,不会飞,有黑白二色,鸵鸟
是鸟,会游泳,不会飞,有黑白二色,企鹅
是鸟,善飞,信天翁'''
# 将数据预处理
datas = txt.split('\n')
#print(datas)
for data in datas:
    data = data.split(',')
    data_process_list.append(data[:-1])
    #print(data_process_list)
    data_result_list.append(data[-1].replace('\n', ''))
    # print(data_result_list)
result_list = ['信天翁', '鸵鸟', '斑马', '长颈鹿', '虎', '金钱豹', '企鹅']
    # 数据库对应的过程
database = {'有毛发': '有毛发', '有奶': '有奶', '有羽毛': '有羽毛', '会飞': '会飞', '会下蛋': '会下蛋', '吃肉': '吃肉', '有犬齿': '有犬齿',
            '有爪': '有爪', '眼盯前方': '眼盯前方', '有蹄': '有蹄', '是咀嚼反刍动物': '是咀嚼反刍动物', '是黄褐色': '是黄褐色', '身上有暗斑点': '身上有暗斑点', '身上有黑色条纹': '身上有黑色条纹',
            '有长脖子': '有长脖子', '有长腿': '有长腿', '不会飞': '不会飞', '会游泳': '会游泳', '有黑白二色': '有黑白二色', '善飞': '善飞', '是哺乳动物': '是哺乳动物',
            '是鸟': '是鸟', '是食肉动物': '是食肉动物', '是蹄类动物': '是蹄类动物', '金钱豹': '金钱豹', '虎': '虎', '长颈鹿': '长颈鹿', '斑马': '斑马',
            '鸵鸟': '鸵鸟', '企鹅': '企鹅', '信天翁': '信天翁'}


root = Tk()
root.title('夏雨花费脑筋的动物专家识别系统')
root.geometry('900x600')

frame1 = Frame(root, relief=RAISED)
frame1.place(relx=0.0)

frame3 = Frame(root, relief=RAISED)
frame3.place(relx=0.2)

frame4 = Frame(root, relief=RAISED)
frame4.place(relx=0.4,relheight=0.4,width=300)

frame2 = Frame(root, relief=GROOVE)
frame2.place(relx=0.8)

Lstbox1 = Listbox(frame1)
Lstbox1.pack()

Lstbox2 = Listbox(frame3)
Lstbox2.pack()

txt=Text(frame4)
txt.pack()

entry = Entry(frame2)
entry.pack()

btn1 = Button(frame2, text='初始化', command=lambda: ini1(data_process_list, data_result_list))
btn1.pack(fill=X)

btn2 = Button(frame2, text='添加', command=ins)
btn2.pack(fill=X)

btn3 = Button(frame2, text='添加2', command=ins2)  # 添加和插入功能实质上是一样的
btn3.pack(fill=X)

btn4 = Button(frame2, text='修改', command=updt)
btn4.pack(fill=X)

btn9 = Button(frame2, text='修改2', command=updt1)
btn9.pack(fill=X)

btn5 = Button(frame2, text='删除', command=delt)
btn5.pack(fill=X)

btn6 = Button(frame2, text='清空', command=clear)
btn6.pack(fill=X)

btn7 = Button(frame2, text='查找', command=lambda:find_data(list_data))
btn7.pack(fill=X)

btn8 = Button(frame2, text='加入', command=plus)
btn8.pack(fill=X)
# 最终结果列表




root.mainloop()

 其实也是参照了其他博主的代码,然后改了一些,添加了一些自己的东西

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值