import sys#前6行为推荐的窗口写法
import getopt
import unicodedata
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
import tkinter #以下为添加库
from tkinter import *
from tkinter.messagebox import showinfo
from tkinter import scrolledtext #创建带滚动条的文本框使用
window = Tk()
window.title('范式计算器')
window.geometry('510x620')
window.resizable(width=False, height=False) #使窗口的长宽不可被更改
window['bg']='#191970'
l = tkinter.Label(window, text='请输入任意一个命题,规则如下:\
用大写或者小写的英文字母表示命\n\
题变项,输入联结词需要按屏幕上\
的五个联结词按钮,最终的结果将显\n\
示在下方的文本框中,可以自由输入\
括号。每次运算系统会自动清零。\n\
区分大小写。优先级如下:\n\
┐优先∧优先∨优先→优先↔',justify=LEFT, font=('Arial,13')).place(x=10, y=10)
var = tkinter.StringVar()
e = tkinter.Entry(window, textvariable=var, width=67)
e.place(x=15, y=105)
def no():#设置按键出发事件,一下七个函数用于输入符号和关联词
e.insert('insert', '┐')
def left():
e.insert('insert', '(')
def right():
e.insert('insert', ')')
def an():
e.insert('insert', '∧')
def ei():
e.insert('insert', '∨')
def imp():
e.insert('insert', '→')
def equ():
e.insert('insert', '↔')
b_no = tkinter.Button(window, text='┐', width=5, height=2, command=no)
b_no.place(x=15, y=140)#这些是锚定按钮之用
b_an = tkinter.Button(window, text='∧', width=5, height=2, command=an)
b_an.place(x=87, y=140)
b_ei = tkinter.Button(window, text='∨', width=5, height=2, command=ei)
b_ei.place(x=159, y=140)
b_imp = tkinter.Button(window, text='→', width=5, height=2, command=imp)
b_imp.place(x=230, y=140)
b_equ = tkinter.Button(window, text='↔', width=5, height=2, command=equ)
b_equ.place(x=299, y=140)
b_left = tkinter.Button(window, text='(', width=5, height=2, command=left)
b_left.place(x=372, y=140)
b_right = tkinter.Button(window, text=')', width=5, height=2, command=right)
b_right.place(x=444, y=140)
out_put = tkinter.StringVar()
#输出显示的文本框
t = scrolledtext.ScrolledText(window,bg='white', height=14.5, width=23,font=('微软雅黑',12))
t.place(x=15, y=280, anchor='nw')
t_fanshi = scrolledtext.ScrolledText(window,bg='white', height=14.5, width=23,font=('微软雅黑',12))
t_fanshi.place(x=260, y=280, anchor='nw')
t3 = Text(window,bg='white', height=2, width=25,font=('微软雅黑',12))
t3.place(x=260, y=210, anchor='nw')
my_input = '' # 输入字符串,即输入的原始命题
all_letters = [] # 命题中所有的字母
my_parse = '' #等值演算后后的命题
hequ_result = [] #列表形式的合取输出,值为0、1
xiqu_result = [] #列表形式的析取输出
hequ_term ='' #字符串格式的输出
xiqu_term ='' #字符串格式的输出
output = '' #最终修饰输出到真值表文本框内的字符串
output_fanshi = '' #最终修饰输出到范式文本框内的字符串
my_parse_out = '' #定义一个等值演算后的式子的副本便于输出
wrong = 0 #错误标记初始化为0,如果输入正确,就不修改为1
value_rev=[] #用于存放短除取余倒置后的用例列表
wrong1=0 #括号数量不匹配
wrong2=0 #输入是否为空
wrong3=0 #关联词用错
wrong4=0 #非法符号
wrong5=0 #字母连续输入
def sub(string, num, replace): # 将字符串中的第num个字符改成replace值
l = []
l = list(string) # 将字符串转换为列表,列表的每一个元素为一个字符
l[num] = replace # 修改字符串的第num个字符为repalce
newS = ''.join(l) # 将列表重新连接为字符串
return newS
def getInput():
global my_input
my_input = e.get()
i = 0
for h in my_input:
if h == '┐':
my_input = sub(my_input, i, '~')#调用sub函数将'┐'换成能识别的
if h == u'∧':
my_input = sub(my_input, i, '&')#同上
if h == u'∨':
my_input = sub(my_input, i, '|')
if h == u'→':
my_input = sub(my_input, i, '>')
if h == u'↔':
my_input = sub(my_input, i, ':')
i = i + 1
def check(): # 判断是否存在非法字符和查找所有字符并排序
global my_input, all_letters,wrong,wrong1,wrong2,wrong3,wrong4,wrong5
wrong=wrong1=wrong2=wrong3=wrong4=wrong5=0
all_letters = []
n=len(my_input)
for i in range(n):
if my_input[i] >= 'A' and my_input[i] <= 'Z' or my_input[i] >= 'a' and my_input[i] <= 'z': #判断是否为字母
if i<n-1: #判断是否结尾
if my_input[i+1] >= 'A' and my_input[i+1] <= 'Z' or my_input[i+1] >= 'a' and my_input[i+1] <= 'z':
wrong=wrong5 = 1 # 判断是否有连续输入的字母
if my_input[i] not in all_letters: # 如果c还没有存到al�
评论0