python課程小作業之桌面小工具系統

from  tkinter import *#圖形界面包
from tkinter import messagebox
import os.path
import os
import math
import time
import copy
file_list=os.listdir('c:\\')  #返回c盤目錄
if 'windowstools' not in file_list:#若不存在目錄則創建工作目錄
    os.mkdir('c:\\windowstools')
def submit1():#成績管理
    
    def submit1():
        
        s1=u1.get()
        s2=u2.get()
        if os.path.exists('c:\\windowstools\\'+s1+'.txt')==False:
            messagebox.showinfo('提示','用戶名不存在!')      #錯與提示
            u1.set('')
            u2.set('')
            return
        f1=open('c:\\windowstools\\'+s1+'.txt','r+');
        ss=f1.readlines()
        s=[]
        f1.close()
        for i in ss:
            s.append(i.replace('\n',''))
        if s[0]!=s2:
            messagebox.showinfo('提示','密碼錯誤!')  #錯誤提示
            u2.set('')
            return
        u1.set('')
        u2.set('')
        def sub1():
            x=0
            j=0
            n=0
            f1=open('c:\\windowstools\\'+s1+'.txt','r+');
            ss=f1.readlines()
            s=[]
            f1.close()
            for i in ss:
                s.append(i.replace('\n',''))
            w=Toplevel()
            w.title('成績統計')
            f=Frame(w)
            f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
            for i in range(3,len(s)):
                if i%3==0:
                    x=x+int(s[i+1])
                    j=j+int(s[i+2])
                    n=n+1
            Label(f,text='科目數:  '+str(n)).grid(row=0,column=0,padx=5,pady=10)
            Label(f,text='總學分:  '+str(x)).grid(row=1,column=0,padx=5,pady=10)
            Label(f,text='平均績點:'+str(j/n)).grid(row=2,column=0,padx=5,pady=10)
        def sub2():
            f1=open('c:\\windowstools\\'+s1+'.txt','r+');
            ss=f1.readlines()
            s=[]
            f1.close()
            for i in ss:
                s.append(i.replace('\n',''))
            w=Toplevel()
            w.title('成績統計')
            f=Frame(w)
            f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
            Label(f,text='科目').grid(row=0,column=0,padx=5,pady=10)
            Label(f,text='學分 ').grid(row=0,column=1,padx=5,pady=10)
            Label(f,text='績點 ').grid(row=0,column=2,padx=5,pady=10)
            r=1
            c=0
            for i in range(3,len(s)):
                    Label(f,text=s[i]).grid(row=r,column=c,padx=5,pady=10)
                    c=c+1
                    if (i+1)%3==0:
                        r=r+1
                        c=0
                        
        def sub3():
            def sub1():
                f1=open('c:\\windowstools\\'+s1+'.txt','r+')
                while True:
                    if f1.readline()=='':
                        break;
                f1.write(u3.get()+'\n')
                f1.write(u4.get()+'\n')
                f1.write(u5.get()+'\n')
                f1.close()
                messagebox.showinfo('提示','保存成功!')
            w=Toplevel()
            w.title('添加成績')
            f=Frame(w)
            f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
            Label(f,text='科目:').grid(row=2,column=0,padx=5,pady=10)
            u3=StringVar()
            Entry(f,textvariable=u3).grid(row=2,column=1,padx=5,pady=10)
            Label(f,text='學分:').grid(row=3,column=0,padx=5,pady=10)
            u4=StringVar()
            l1=Entry(f,textvariable=u4).grid(row=3,column=1,padx=5,pady=10)
            Label(f,text='績點:').grid(row=4,column=0,padx=5,pady=10)
            u5=StringVar()
            l2=Entry(f,textvariable=u5).grid(row=4,column=1,padx=5,pady=10)
            Button(f,text='確定',command=sub1).grid(row=5,column=1)
        w=Toplevel()
        w.title('歡迎'+s[1])
        f=Frame(w)
        f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
        Label(f,text='姓名:'+s[1]).grid(row=0,column=0,padx=5,pady=10)
        Label(f,text='學號:'+s[2]).grid(row=1,column=0,padx=5,pady=10)
        Button(f,text='成績統計',command=sub1).grid(row=2,column=0,padx=5,pady=10)
        Button(f,text='瀏覽成績',command=sub2).grid(row=3,column=0,padx=5,pady=10)
        Button(f,text='添加成績',command=sub3).grid(row=4,column=0,padx=5,pady=10)
        
    def test(s):
        for i in s:
            if i not in '0123456789' and i not in 'abcdefghijklmnopqrstuvwxyz':
                return 0
        return 1

    def submit2():
        
        def submit3():
            s1=u3.get()
            s2=u4.get()
            s3=u5.get()
            if len(s1)<3:
                messagebox.showinfo('提示','用戶名長度大於3!')  #錯誤提示
                return
            if len(s2)<3 or len(s3)<3:
                messagebox.showinfo('提示','密碼長度大於3!')
                return
            if test(s1)==0:
                messagebox.showinfo('提示','用戶名由字母和數字組成!')
                return
            if test(s2)==0:
                messagebox.showinfo('提示','密碼由字母和數字組成!')
                return 
            if test(s3)==0:
                messagebox.showinfo('提示','密碼由字母和數字組成!')
                return
            if s3!=s2:
                messagebox.showinfo('提示','兩次密碼不同!,請重新輸入!')
                u5.set('')
                return
            if os.path.exists(s1+'.txt')==True:
                messagebox.showinfo('提示','用戶名已存在,請重新註冊!')
                u3.set('')
                u4.set('')
                u5.set('')
                return
            def submit4():
                f1=open('c:\\windowstools\\'+s1+'.txt','r+')
                while True:
                    if f1.readline()=='':
                        break;
                f1.write(ui.get()+'\n')
                f1.write(uj.get()+'\n')
                messagebox.showinfo('提示','保存成功!')
                f1.close()
            f1=open('c:\\windowstools\\'+s1+'.txt','a+')
            f1.write(s2+'\n')
            f1.close()
            messagebox.showinfo('提示','註冊成功!')
            t=Toplevel()
            t.title('填寫個人信息')
            ff=Frame(t)
            ff.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
            Label(ff,text='姓名:').grid(row=0,column=0,padx=5,pady=10)
            Label(ff,text='學號:').grid(row=1,column=0,padx=5,pady=10)
            ui=StringVar()
            Entry(ff,textvariable=ui).grid(row=0,column=1,padx=5,pady=10)
            uj=StringVar()
            Entry(ff,textvariable=uj).grid(row=1,column=1,padx=5,pady=10)
            Button(ff,text='確定',command=submit4).grid(row=5,column=1)
        w=Toplevel()
        w.title('註冊')
        a.geometry('400x300')
        f=Frame(w)
        f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
        l=Label(f,text='用戶名和密碼均由字母和數字組成,區分大小寫')
        l.grid(row=0,column=0,rowspan=1,columnspan=2,padx=20,pady=20)
        Label(f,text='用戶名和密碼長度大於3').grid(row=1,column=1,padx=5,pady=10)
        Label(f,text='用戶名:').grid(row=2,column=0,padx=5,pady=10)
        u3=StringVar()
        Entry(f,textvariable=u3).grid(row=2,column=1,padx=5,pady=10)
        Label(f,text='密碼:').grid(row=3,column=0,padx=5,pady=10)
        u4=StringVar()
        l1=Entry(f,textvariable=u4,show='*').grid(row=3,column=1,padx=5,pady=10)
        Label(f,text='確認密碼:').grid(row=4,column=0,padx=5,pady=10)
        u5=StringVar()
        l2=Entry(f,textvariable=u5,show='*').grid(row=4,column=1,padx=5,pady=10)
        Button(f,text='確定',command=submit3).grid(row=5,column=0)
        Button(f,text='退出系統',command=quit).grid(row=5,column=1)
    a=Toplevel()
    a.title('歡迎使用成績管理系統')
    a.geometry('400x300')
    f=Frame(a)
    f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
    l=Label(f,text='學生成績管理系統',font=('Arial',15))
    l.grid(row=0,column=0,rowspan=1,columnspan=2,padx=20,pady=20)
    Label(f,text='用戶名:').grid(row=1,column=0,padx=5,pady=10)
    u1=StringVar()
    Entry(f,textvariable=u1).grid(row=1,column=1,padx=5,pady=10)
    Label(f,text='密碼:').grid(row=2,column=0,padx=5,pady=10)
    u2=StringVar()
    Entry(f,textvariable=u2,show='*').grid(row=2,column=1,padx=5,pady=10)   #  *表示密碼框輸入隱藏
    Button(f,text='登陸',command=submit1).grid(row=3,column=0,padx=10,pady=10)
    Button(f,text='註冊',command=submit2).grid(row=3,column=1,padx=10,pady=10)

def submit2():  #計算器
    global s
    s=''
    def submitt1():
        global s
        s=s+'+'
        u1.set(s)
    def submitt2():
        global s
        s=s+'-'
        u1.set(s)
    def submitt3():
        global s
        s=s+'*'
        u1.set(s)
    def submitt4():
        global s
        s=s+'/'
        u1.set(s)
    def submitt0():
        global s
        s=''
        u1.set(s)
    def submitt5():
        global s
        s=s+'7'
        u1.set(s)
    def submitt6():
        global s
        s=s+'8'
        u1.set(s)
    def submitt7():
        global s
        s=s+'9'
        u1.set(s)
    def submitt8():
        global s
        s=s+'4'
        u1.set(s)
    def submitt9():
        global s
        s=s+'5'
        u1.set(s)
    def submitt10():
        global s
        s=s+'6'
        u1.set(s)
    def submitt11():
        global s
        s=s+'1'
        u1.set(s)
    def submitt12():
        global s
        s=s+'2'
        u1.set(s)
    def submitt13():
        global s
        s=s+'3'
        u1.set(s)
    def submitt14():
        global s
        s=s+'0'
        u1.set(s)
    def submitt15():
        global s
        s=s+'.'
        u1.set(s)
    def submitts():
        global s
        if '.' in s:
            i=float(s)
        else:
            i=int(s)
        i=math.sqrt(i)
        u1.set(str(i))
        s=''
    def submittp():
        global s
        if '.' in s:
            i=float(s)
        else:
            i=int(s)
        
        i=i*i
        u1.set(str(i))
        s=''
    def submittr():
        global s
        re=eval(s)
        s=''
        u1.set(str(re))
    def submittjc():
        global s
        i=int(s)
        sum=1
        for j in range(1,i+1):
            sum=sum*j
        u1.set(str(sum))
        s=''
    a=Toplevel()
    a.title('歡迎使用計算器')
    f=Frame(a)
    f.pack(padx=80, pady=40, ipadx=20)
    u1=StringVar()
    Entry(f,textvariable=u1).grid(row=0,column=0,padx=5,pady=10,columnspan=4)
    Button(f,text='加',command=submitt1).grid(row=1,column=0,ipadx=5,ipady=5)
    Button(f,text='減',command=submitt2).grid(row=1,column=1,ipadx=5,ipady=5)
    Button(f,text='乘',command=submitt3).grid(row=1,column=2,ipadx=5,ipady=5)
    Button(f,text='除',command=submitt4).grid(row=1,column=3,ipadx=5,ipady=5)
    Button(f,text='清除',command=submitt0).grid(row=2,column=0,ipadx=5,ipady=5)
    Button(f,text='7',command=submitt5).grid(row=2,column=1,ipadx=5,ipady=5)
    Button(f,text='8',command=submitt6).grid(row=2,column=2,ipadx=5,ipady=5)
    Button(f,text='9',command=submitt7).grid(row=2,column=3,ipadx=5,ipady=5)
    Button(f,text='開方',command=submitts).grid(row=3,column=0,ipadx=5,ipady=5)
    Button(f,text='4',command=submitt8).grid(row=3,column=1,ipadx=5,ipady=5)
    Button(f,text='5',command=submitt9).grid(row=3,column=2,ipadx=5,ipady=5)
    Button(f,text='6',command=submitt10).grid(row=3,column=3,ipadx=5,ipady=5)
    Button(f,text='平方',command=submittp).grid(row=4,column=0,ipadx=5,ipady=5)
    Button(f,text='1',command=submitt11).grid(row=4,column=1,ipadx=5,ipady=5)
    Button(f,text='2',command=submitt12).grid(row=4,column=2,ipadx=5,ipady=5)
    Button(f,text='3',command=submitt13).grid(row=4,column=3,ipadx=5,ipady=5)
    Button(f,text='等於',command=submittr).grid(row=5,column=0,ipadx=5,ipady=5)
    Button(f,text='0',command=submitt14).grid(row=5,column=1,ipadx=5,ipady=5)
    Button(f,text='.',command=submitt15).grid(row=5,column=2,ipadx=5,ipady=5)
    Button(f,text='階乘',command=submittjc).grid(row=5,column=3,ipadx=5,ipady=5)
def submit3():  #日曆模塊
    def judge_ruinian(y):#判斷是否爲瑞年
        if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:  
            return True  
        else:  
           return False 
    def mon_day(y,m):#判斷某一年的某一個月多少天
        if m in [1,3,5,7,8,10,12]:
            return 31
        elif m in [4,6,9,11]:
            return 30
        elif judge_ruinian(y):
            return 29
        else:
            return 28
    def day_1800(y,m):#自1800年以來過了多少天
        days = 0  
        for y1 in range(1800, y):  
           if judge_ruinian(y1):  
              days=days+366  
           else:  
              days=days+365  
 
        for m in range(1, m):  
           days=days+mon_day(y, m)  

        return days  
    def mon_ji(y,m):#當月一號是周幾
        return 3+day_1800(y,m)%7
    t1=time.strftime('%Y-%m-%d',time.localtime(time.time()))
    t=t1.split('-')  #分割得到時間
    year=int(t[0])
    month=int(t[1])
    day=int(t[2])
    a=Toplevel()
    a.title('歡迎使用日曆')
    f=Frame(a)
    f.pack(padx=80, pady=40, ipadx=20)
    def xianshi(y,m,d):#圖形界面打印日曆
        Label(f,text=t1).grid(row=0,column=0,columnspan=7)
        Label(f,text='Mon  Tue  Wed  Thu  Fri  Sat  Sun   ').grid(row=1,column=0,columnspan=7)
        i=mon_ji(y,m)
        k=2
        if i!=7:
            Label(f,text=' ').grid(row=2,column=0)
            Label(f,text=' ').grid(row=2,column=1)
            Label(f,text=' ').grid(row=2,column=2,columnspan=i)
            k=3
        for j in range(1,mon_day(y,m)+1):
            if j==day:
                Label(f,text=str(j),bg='red').grid(row=k,column=i-1)
            else:
                Label(f,text=str(j)).grid(row=k,column=i-1)
            i=i+1
            if i%8==0:
                i=1
                k=k+1
        def submit1():
            xianshi(y,m-1,d)
        def submit2():
            xianshi(y,m+1,d)
        Button(f,text='上月',command=submit1).grid(row=k+1,column=0,ipadx=5,ipady=5,columnspan=2)
        Button(f,text='下月',command=submit2).grid(row=k+1,column=5,ipadx=5,ipady=5,columnspan=2)
    xianshi(year,month,day) 
def submit4():  #日期計算
    class Date:
        def __init__(self, date):
            self.setyear(date)  # 年
            self.setmonth(date)   # 月
            self.setday(date)  # 日
            self.date = date

        def setyear(self, date):  # 設置年
            a = date.split('-')
            self.year = int(a[0])

        def setmonth(self, date):  # 設置月
            a = date.split('-')
            b = int(a[1].lstrip('0'))
            self.month = b

        def setday(self, date):  # 設置日
            a = date.split('-')
            b = int(a[2].lstrip('0'))
            self.day = b

        def redate(self):
            return self.date

        def show(self): 
            messagebox.showinfo('結果',str(self.year)+ '-'+ str(self.month)+ '-'+str( self.day))

        def isdeap(self):
            if self.year%400 == 0 or (self.year%4 == 0 and self.year%100 != 0): 
                return 1
            else:
                return 0 

        def whichday(self):  
            month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
            if self.isdeap() == 1:
                month[1] = 29
            if self.month == 1:
                return self.day
            else:
                n = sum(month[:self.month-1])
                return n+self.day

        def bigorsmall(self, date1):  
            big = self
            small = date1
            flag = 0  
            
            if self.year > date1.year:
                big = self
                small = date1
            elif self.year < date1.year:
                big = date1
                small = self
            else:
                if self.month > date1.month:
                    big = self
                    small = date1
                elif self.month < date1.month:
                    big = date1
                    small = self
                else:
                    if self.day > date1.day:
                        big = self
                        small = date1
                    elif self.day < date1.day:
                        big = date1
                        small = self
                    else:
                        big = self
                        small = date1
                        flag = 1

            if big == date1:
                messagebox.showinfo('結果',str(self.redate())+'早於'+str(date1.redate()))
            elif big == self and flag != 1:
                messagebox.showinfo('結果',str(self.redate())+'晚於'+str(date1.redate()))
            else:
                messagebox.showinfo('結果',str(self.redate())+str(date1.redate())+'是同一天')
            list = [big,small]
            return list

        def dateinterval(self, date1): 
            big = self
            small = date1
          
            if self.year > date1.year:
                big = self
                small = date1
            elif self.year < date1.year:
                big = date1
                small = self
            else:
                if self.month > date1.month:
                    big = self
                    small = date1
                elif self.month < date1.month:
                    big = date1
                    small = self
                else:
                    if self.day >= date1.day:
                        big = self
                        small = date1
                    else:
                        big = date1
                        small = self
            if big.year != small.year:
                x = big.whichday()
                y = 365-small.whichday()
                if small.isdeap() == 1:
                    y = 366-small.whichday()
                z = 0  
                a = small.year+1
                for i in range(big.year-small.year-1):
                    if a%400 == 0 or (a%4 == 0 and a%100 != 0):
                        z = z+366
                    else:
                        z = z+365
                    a = a+1
                return x+y+z
            else:
                x = big.whichday()
                y = small.whichday()
                return x-y

        def nextdate(self, n):  
            date = copy.deepcopy(self)
            month1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  
            month2 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  
            while 1:
                if date.isdeap() == 1:
                    if n+date.day <= month2[date.month-1]:
                        date.day = date.day+n
                        break
                    else:
                        n = n-(month2[date.month-1]-date.day)
                        date.day = 0
                        date.month = date.month % 12+1
                        if date.month == 1:
                            date.year = date.year+1
                else:
                    if n+date.day <= month1[date.month-1]:
                        date.day = date.day+n
                        break
                    else:
                        n = n-(month1[date.month-1]-date.day)
                        date.day = 0
                        date.month = date.month % 12+1
                        if date.month == 1:
                            date.year = date.year+1
            date.show()

       
    if __name__ == '__main__':
        def submit1():
            def submit():
                a=u1.get()
                b=u2.get()
                date1 = Date(a)
                date2 = Date(b)
                x = date1.dateinterval(date2)
                messagebox.showinfo('結果','這兩個日期相差'+str(x)+ '天')
            a=Toplevel()
            a.title(' ')
            f=Frame(a)
            f.pack()#f爲塊容器
            Label(f,text='輸入日期(格式爲x-y-z,如2010-01-11').grid(row=0,column=0,padx=5,pady=10)
            u1=StringVar()
            Entry(f,textvariable=u1).grid(row=1,column=0,padx=5,pady=10)
            u2=StringVar()
            Entry(f,textvariable=u2).grid(row=2,column=0,padx=5,pady=10)
            Button(f,text='確定',command=submit).grid(row=3,column=0,padx=10,pady=10)

        def submit2():
            def submit():
                a=u1.get()
                b=u2.get()
                date1 = Date(a)
                date2 = Date(b)
                date1.bigorsmall(date2)
            a=Toplevel()
            a.title(' ')
            f=Frame(a)
            f.pack()#f爲塊容器
            Label(f,text='輸入日期(格式爲x-y-z,如2010-01-11').grid(row=0,column=0,padx=5,pady=10)
            u1=StringVar()
            Entry(f,textvariable=u1).grid(row=1,column=0,padx=5,pady=10)
            u2=StringVar()
            Entry(f,textvariable=u2).grid(row=2,column=0,padx=5,pady=10)
            Button(f,text='確定',command=submit).grid(row=3,column=0,padx=10,pady=10)

        def submit3():
            def submit():
                a=u1.get()
                b=u2.get()
                date1 = Date(a)
                date1.nextdate(b)
            a=Toplevel()
            a.title(' ')
            f=Frame(a)
            f.pack()#f爲塊容器
            Label(f,text='輸入日期(格式爲x-y-z,如2010-01-11,天數').grid(row=0,column=0,padx=5,pady=10)
            u1=StringVar()
            Entry(f,textvariable=u1).grid(row=1,column=0,padx=5,pady=10)
            u2=StringVar()
            Entry(f,textvariable=u2).grid(row=2,column=0,padx=5,pady=10)
            Button(f,text='確定',command=submit).grid(row=3,column=0,padx=10,pady=10)


            
        def submit4():
            def submit():
                a=u1.get()
                date1 = Date(a)
                x = date1.whichday()
                messagebox.showinfo('結果','該日期是今年的第'+str( x)+ '天')
            a=Toplevel()
            a.title(' ')
            f=Frame(a)
            f.pack()#f爲塊容器
            Label(f,text='輸入日期(格式爲x-y-z,如2010-01-11').grid(row=0,column=0,padx=5,pady=10)
            u1=StringVar()
            Entry(f,textvariable=u1).grid(row=1,column=0,padx=5,pady=10)

            Button(f,text='確定',command=submit).grid(row=3,column=0,padx=10,pady=10)

        
        a=Toplevel()
        a.title('日期系統')
        f=Frame(a)
        f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
        Button(f,text='兩個日期間  的間隔 ',command=submit1).grid(row=0,column=1,padx=10,pady=10)
        Button(f,text='比較兩個日期的大小',command=submit2).grid(row=1,column=1,padx=10,pady=10)
        Button(f,text='日期若干天后的日期',command=submit3).grid(row=3,column=1,padx=10,pady=10)
        Button(f,text='日期是一年的第幾天',command=submit4).grid(row=4,column=1,padx=10,pady=10)
        Button(f,text='退出',command=quit).grid(row=5,column=1,padx=10,pady=10)
       
      


def submit5():  #備忘錄
    global k
    k=len(os.listdir('c:\\windowstools\\beiwanglu\\'))#獲取文件個數
    k=k+1
    def submit1():
         def submit1():
             global k
             
             f=open('c:\\windowstools\\beiwanglu\\'+str(k)+'.txt','a+')
             f.write(u.get())
             f.close()
             k=k+1
         a=Toplevel()
         a.title('編輯')
         f=Frame(a)
         f.pack(padx=80, pady=40, ipadx=20)
         u=StringVar()
         Entry(f,textvariable=u).grid(row=0,column=0,rowspan=40,ipadx=80,ipady=80,columnspan=40)
         Button(f,text='保存',command=submit1).grid(row=41,column=1,padx=10,pady=10)
         Button(f,text='清除',command=submit2).grid(row=41,column=2,padx=10,pady=10)
    def submit2():
        a=Toplevel()
        a.title('瀏覽')
        f=Frame(a)
        f.pack(padx=80, pady=40, ipadx=20)
        s=os.listdir('c:\\windowstools\\beiwanglu\\') #返回文件列表
        k=0
        for i in s:
            f1=open('c:\\windowstools\\beiwanglu\\'+i,'r') #打開文件
            t=f1.readlines()
            Label(f,text=t).grid(row=k,column=0,padx=5,pady=10)
            k=k+1
    def submit3():
        def submit1():
            s1=u.get()
            s=os.listdir('c:\\windowstools\\beiwanglu\\') #返回文件列表
            k=0
            for i in s:
                f1=open('c:\\windowstools\\beiwanglu\\'+i,'r') #打開文件
                t=f1.readlines()
                for t1 in t:
                    if s1 in t1:
                        a=Toplevel()
                        a.title('結果')
                        f=Frame(a)
                        f.pack(padx=80, pady=40, ipadx=20)
                        Label(f,text=t).grid(row=k,column=0,padx=5,pady=10)
                        k=k+1
        a=Toplevel()
        a.title('搜索')
        f=Frame(a)
        f.pack(padx=80, pady=40, ipadx=20)
        u=StringVar()
        Entry(f,textvariable=u).grid(row=0,column=0)
        Button(f,text='搜索',command=submit1).grid(row=1,column=0,padx=10,pady=10)
    file_list=os.listdir('c:\\windowstools\\')  #返回c盤目錄
    if 'beiwanglu' not in file_list:#若不存在目錄則創建工作目錄
        os.mkdir('c:\\windowstools\794588101.txt\beiwanglu')
    a=Toplevel()
    a.title('備忘錄')
    f=Frame(a)
    f.pack(padx=80, pady=40, ipadx=20)
    Button(f,text='新建',command=submit1).grid(row=0,column=1,padx=10,pady=10)
    Button(f,text='瀏覽',command=submit2).grid(row=1,column=1,padx=10,pady=10)
    Button(f,text='搜索',command=submit3).grid(row=2,column=1,padx=10,pady=10)
def submit6():#搜索文件,用樹算法遍歷文件樹
    def submit1():
         submit2()
         submit3()
         submit4()
    def submit2():
        gg=u.get()
        s='c:\\'
        dir=[]
        def search(s):
            for i in os.listdir(s):
                if gg==i:
                    messagebox.showinfo('提示',s+i)
                    return 0
                if os.path.isdir(i) and i!='' and i!='.' and i!='..' and i!='...':
                    search(s+i+'\\')
        search(s)               
    def submit3():
        gg=u.get()
        s='d:\\'
        dir=[]
        def search(s):
            for i in os.listdir(s):
                if gg==i:
                    messagebox.showinfo('提示',s+i)
                    return 0
                if os.path.isdir(i) and i!='' and i!='.' and i!='..' and i!='...':
                    search(s+i+'\\')
        search(s)    
    def submit4():
        gg=u.get()
        s='e:\\'
        dir=[]
        def search(s):
            for i in os.listdir(s):
                if gg==i:
                    messagebox.showinfo('提示',s+i)
                    return 0
                if os.path.isdir(i) and i!='' and i!='.' and i!='..' and i!='...':
                    search(s+i+'\\')
        search(s)            
    a=Toplevel()
    a.title('文件搜索') 
    f=Frame(a)
    f.pack(padx=80, pady=40, ipadx=20)
    Label(f,text='請輸入文件名').grid(row=0,column=0,padx=5,pady=10)
    u=StringVar()
    Entry(f,textvariable=u).grid(row=0,column=1,padx=5,pady=10)
    Button(f,text='全盤搜索',command=submit1).grid(row=1,column=0,padx=10,pady=10)
    Button(f,text='C盤搜索',command=submit2).grid(row=1,column=1,padx=10,pady=10)
    Button(f,text='D盤搜索',command=submit3).grid(row=2,column=0,padx=10,pady=10)
    Button(f,text='E盤搜索',command=submit4).grid(row=2,column=1,padx=10,pady=10)
    
def submit7():
    class Watch(Frame):
        
         msec = 100
         def __init__(self, parent=None, **kw):
             Frame.__init__(self, parent, kw)
             self._start = 0.0
             self._elapsedtime = 0.0
             self._running = False
             self.timestr = StringVar()
             self.makeWidgets()
         def makeWidgets(self):
             l = Label(self, textvariable = self.timestr)
             self._setTime(self._elapsedtime)
             l.grid(row=0,column=0,padx=5,pady=10,columnspan=3)
         def _update(self):
             self._elapsedtime = time.time() - self._start
             self._setTime(self._elapsedtime)
             self._timer = self.after(self.msec, self._update)
         def _setTime(self, elap):
             minutes = int(elap/60)
             seconds = int(elap-minutes*60.0)
             hseconds = int((elap - minutes*60.0 - seconds) *100)
             self.timestr.set('%2d:%2d:%2d' %(minutes, seconds, hseconds))
         def Start(self):
             if not self._running:
                 self._start = time.time() - self._elapsedtime
                 self._update()
                 self._running = True
         def Stop(self):
             if self._running:
                 self.after_cancel(self._timer)
                 self._elapsedtime = time.time() - self._start
                 self._setTime(self._elapsedtime)
                 self._running = False
         def Reset(self):
             self._start = time.time()
             self._elapsedtime = 0.0
             self._setTime(self._elapsedtime)
             

    tt= Toplevel()
    tt.geometry('400x200')
    tt.title('秒錶')
    a=Frame(tt)
    a.pack(padx=80, pady=40, ipadx=20)
    sw=Watch(a)
    sw.grid(row=0,column=0,padx=5,pady=10,columnspan=3)
    Button(a, text = '開始', command = sw.Start).grid(row=1,column=0,padx=5,pady=10)
    Button(a, text = '停止', command = sw.Stop).grid(row=1,column=1,padx=5,pady=10)
    Button(a, text = '重置', command = sw.Reset).grid(row=1,column=2,padx=5,pady=10)


def submit8():#LL1文法
    def put_in():#輸入
         global a,vn,vt,start
         a=[]
         top=Tk()
         top.title('LL1文法')
         f=Frame(top)
         f.pack(padx=80, pady=80, ipadx=40)#f爲塊容器

         def submit1():     
              i=u3.get()+'保存成功'
              p.set(i)
              global start
              start=u3.get()
              u3.set('')
         def submit():#按鈕事件
              u1=u.get()
              if u1!='0':
                   a.append(list(u1))
                   gg=u1+'保存成功'
                   p.set(gg)
                   u.set('')
              else:
                   gg='輸入結束'
                   p.set(gg)
         def submit2():
              i=u4.get()+'保存成功'
              global vn
              vn=list(u4.get())
              p.set(i)
              u4.set('')
         def submit3():
              i=u5.get()+'保存成功'
              global vt
              vt=list(u5.get())
              
              p.set(i)
              u5.set('')
         lab0 = Label(f, text="               ")
         lab0.grid(row=0, column=0, padx=5, pady=5, sticky='w')

         
         lab2 = Label(f, text="提示")
         lab2.grid(row=1, column=0, padx=5, pady=5, sticky='w')
         p = StringVar()
         ent2 = Entry(f, textvariable=p)
         ent2.grid(row=1, column=1, sticky='ew', columnspan=2)

         
         lab1 = Label(f, text="請輸入產生式,以0結束輸入:")
         lab1.grid(row=2, column=0, padx=5, pady=5, sticky='w')
         u = StringVar()
         ent1= Entry(f, textvariable=u)
         ent1.grid(row=2, column=1, sticky='ew', columnspan=2)
         button = Button(f, text="確定", command=submit, default='active',bg='green')
         button.grid(row=2, column=3)

         
         lab3= Label(f, text="輸入開始符號")
         lab3.grid(row=3, column=0, padx=5, pady=5, sticky='w')
         u3 = StringVar()
         ent3=Entry(f, textvariable=u3)
         ent3.grid(row=3, column=1, sticky='ew', columnspan=2)
         button =Button(f, text="確定", command=submit1, default='active',bg='green',bd=2)
         button.grid(row=3, column=3)


         lab4= Label(f, text="輸入Vn")
         lab4.grid(row=4, column=0, padx=5, pady=5, sticky='w')
         u4 = StringVar()
         ent4= Entry(f, textvariable=u4)
         ent4.grid(row=4, column=1, sticky='ew', columnspan=2)
         button = Button(f, text="確定", command=submit2, default='active',bg='green',bd=2)
         button.grid(row=4, column=3)

         lab5= Label(f, text="輸入Vt")
         lab5.grid(row=5, column=0, padx=5, pady=5, sticky='w')
         u5 = StringVar()
         ent5=Entry(f, textvariable=u5)
         ent5.grid(row=5, column=1, sticky='ew', columnspan=2)
         button = Button(f, text="確定", command=submit3, default='active',bg='green',bd=2)
         button.grid(row=5, column=3)

         button = Button(f, text="運行程序", command=run, default='active',bg='green',bd=2)
         button.grid(row=6, column=1)
         button = Button(f, text="退出", command=quit, default='active',bg='green',bd=3)
         button.grid(row=6, column=2)

         
    def judge_null():#求能推出空串的非終結符
         null=['*']
         values=[1]*len(vn+vt+null)
         dic=dict(zip(vn+vt+null,values))
         dic['*']=0     
         for un_relation in range(5):
              for i in a:                 
                   sum=0
                   for j in range(3,len(i)):
                        sum=sum+dic[i[j]]
                   if sum==0:
                        dic[i[0]]=0
         return dic
    def first():#求每一個非終結符的FIRST集
         dic=judge_null()
         global f
         f=[]
         for i in range(len(vn)):
              f=f+[set()]
         for ji in range(5):
              for i in range(len(vn)):
                   for j in a:
                        if vn[i]==j[0]:
                             oo=0
                             for i1 in range(3,len(j)):
                                  if dic[j[i1]]==0:
                                       oo=oo+1
                             if oo==len(j)-3 and j[3]!='*':#若右部全部是能推出空符的非終結符
                                  for i1 in range(3,len(j)):
                                       
                                       f[i]=f[i]|f[vn.index(j[i1])]
                                       
                                  f[i]=f[i]|{'*'}
                             else:                              
                                  if j[3] in vt:
                                       f[i].add(j[3])
                                  elif j[3]=='*':
                                       f[i].add('*')
                                  else:
                                       for i1 in range(3,len(j)):
                                            if dic[j[i1]]==0:
                                                 if '*' in f[vn.index(j[i1])]:            
                                                      f[i]=(f[vn.index(j[i1])]|f[i])-{'*'}
                                                 else:
                                                      f[i]=(f[vn.index(j[i1])]|f[i])
                                            else:
                                                 f[i]=(f[vn.index(j[i1])]|f[i])
                                                 break
                                       
         print('非終結符的FIRST集依次爲:')
         print(f)
    def first_chuan():#求每一個產生式右部符號串的FIRST集
         global f1
         dic=judge_null()
         f1=[]
         for i in range(len(a)):
              f1=f1+[set()]
         for i in a:
              k=a.index(i)
              oo=0
              for j in range(3,len(i)):
                   if dic[i[j]]==0:
                        oo=oo+1
              if oo==len(i)-3 and i[3]!='*':#若全部是能推出空符的非終結符
                   for j in range(3,len(i)):
                        f1[k]=f1[k]|f[vn.index(i[j])]
                   f1[k]=f1[k]|{'*'}
              else:
                   if i[3] in vt:#若是以終結符開頭
                        f1[k].add(i[3])
                   elif i[3]=='*':#若是空符
                        f1[k].add('*')
                   else:
                       for j in range(3,len(i)):
                             if dic[i[j]]==0:
                                   f1[k]=(f[vn.index(i[j])]|f1[k])-{'*'}
                             else:
                                  f1[k]=(f[vn.index(i[j])]|f1[k])
                                  break 
         print('符號串的FIRST集依次爲:')
         print(f1)
    def index1(li,k):   #神奇勿動,求在產生式右部某元素在列表第一次出現的位置
         for i in range(3,len(li)):
              if li[i]==k:
                   return i
    def follow_():#計算非終結符的FOLLOW集
         dic=judge_null()
         global follow
         follow=[]
         for i in range(len(vn)):
              follow=follow+[set()]
         follow[vn.index(start)]=follow[vn.index(start)]|{'#'}
         for iii in range(5):
              for i in range(len(vn)):
                   for j in a:
                        for k in j[3:]:
                             if k==vn[i]:
                                  if index1(j,k)==len(j)-1:
                                       follow[i]=follow[i]|follow[vn.index(j[0])]
                                  else:
                                       if j[index1(j,k)+1] in vt:
                                            follow[i]=follow[i]|{j[index1(j,k)+1]}
                                       else:
                                            if dic[j[index1(j,k)+1]]==1:
                                                 follow[i]=(follow[i]|f[vn.index(j[index1(j,k)+1])])-{'*'}
                                            else:
                                                 follow[i]=(follow[i]|f[vn.index(j[index1(j,k)+1])])-{'*'}
                                                 follow[i]=follow[i]|follow[vn.index(j[0])]
         print('follow集依次爲:')
         print(follow)

    def select():
         dic=judge_null()
         global s
         s=[]
         for i in range(len(a)):
              s=s+[set()]
         for i in a:
              k=a.index(i)
              oo=0
              for j in range(3,len(i)):
                   if dic[i[j]]==0:
                        oo=oo+1
              if oo==len(i)-3 :#若全部是能推出空符
                   s[k]=(f1[k]-{'*'})|follow[vn.index(i[0])]
              else:
                   s[k]=f1[k]
         print('select集依次爲:')
         print(s)
    def judge(kk):#判斷文法是不是LL1文法
         b=set()
         global fr
         zz=0
         for i in range(len(a)):
              for k in range(len(a)):
                   if a[i][0]==a[k][0] and i!=k:
                        b=s[i]&s[k]
                        if len(b)!=0:
                             print('不是LL(1)文法,因爲:')
                             print(a[i],'和',a[k],'的select集的交集不爲空')
                             l2=Label(fr,text='不是LL(1)文法,因爲:')
                             l2.grid(row=kk, column=0, padx=5, pady=0, sticky='w')
                             l2=Label(fr,text=(a[i],'和',a[k],'的select集的交集不爲空'))
                             l2.grid(row=kk+1, column=0, padx=5, pady=0, sticky='w')
                             return 0
    def pipei(kk):#匹配字符串
         global fr
         if judge(kk)==0:
              return 0
         def submit2():
              def submit5():
                   global fr
                   c=u3.get()
                   print(c)
                   c='#ii()'
                   c=list(c)
                   st=['#',start]
                   while True:
                        i=0
                        for k in range(len(s)):
                             if st[len(st)-1]==a[k][0] and c[0] in s[k]:
                                  i=1
                                  st.pop()
                                  for j in range(3,len(a[k])):
                                       st=st+[a[k][len(a[k])-j+2]]
                                  if st[len(st)-1]=='*':
                                       st.pop()
                                  if st[len(st)-1]==c[0]:
                                       if c==['#'] and st==['#']:
                                            print('Accept')
                                            l2=Label(ff,text='Accept')
                                            l2.grid(row=kk+3, column=0, padx=5, pady=0, sticky='w')
                                            return 0
                                       c.remove(c[0])
                                       st.pop()
                                  if c==['#'] and st==['#']:
                                       print('Accept')
                                       return 0                  
                        if i==0:
                             print('error')
                             l2=Label(ff,text='匹配失敗')
                             l2.grid(row=kk+3, column=0, padx=5, pady=0, sticky='w')
                             return 0
              f2=Tk()
              f2.title('字符串匹配')
              ff=Frame(f2)
              ff.pack(padx=80, pady=80, ipadx=40)#f爲塊容器        
              l3.Label(ff,text='請輸入待匹配子串')
              l3.grid(row=kk+1, column=0, padx=5, pady=0, sticky='w')
              u3 = StringVar()
              ent3= Entry(ff, textvariable=u3)
              ent3.grid(row=kk+1, column=1, sticky='ew', columnspan=2)
              button = tButton(ff, text="確定", command=submit5, default='active',bg='green',bd=2)
              button.grid(row=kk+1, column=3)
         l2=t.Button(fr,text='字符串匹配',command=submit2, default='active',bg='green',bd=2)
         l2.grid(row=kk, column=1, padx=5, pady=0, sticky='w')
         fr.mainloop()
    def run():
         top1=t.Tk()
         top1.title('LL1文法運算結果')
         global fr
         fr=t.Frame(top1)
         fr.pack(padx=80, pady=80, ipadx=40)#f爲塊容器    
         first()
         first_chuan()
         follow_()
         select()
         l1= Label(fr, text="非終結符FIRST集爲:")
         l1.grid(row=0, column=0, padx=5, pady=5, sticky='w')
         l2=Label(fr,text=f)
         l2.grid(row=0, column=1, padx=5, pady=5, sticky='w')
         l3= Label(fr, text="符號串FIRST集爲:")
         l3.grid(row=1, column=0, padx=5, pady=5, sticky='w')
         l4=Label(fr,text=f1)
         l4.grid(row=1, column=1, padx=5, pady=5, sticky='w')
         l1= Label(fr, text="Follow集爲:")
         l1.grid(row=2, column=0, padx=5, pady=5, sticky='w')
         l2=Label(fr,text=follow)
         l2.grid(row=2, column=1, padx=5, pady=5, sticky='w')
         l1= Label(fr, text="Select集爲:")
         l1.grid(row=3, column=0, padx=5, pady=5, sticky='w')
         kk=4
         for i in a:
              i1=i+['----------------------------------------------------------------']
              l2=Label(fr,text=i1)
              l2.grid(row=kk, column=1, padx=5, pady=0, sticky='w')
              l2=Label(fr,text=s[kk-4])
              l2.grid(row=kk, column=2, padx=0, pady=5, sticky='w')
              kk=kk+1
         button = Button(fr, text="退出", command=quit, default='active',bg='green',bd=5)
         button.grid(row=0, column=3)
         pipei(kk)
         print('3333')
    put_in()

a=Tk()
a.title('歡迎使用桌面小工具系統')
f=Frame(a)
f.pack(padx=80, pady=40, ipadx=20)#f爲塊容器
Button(f,text='成績管理',command=submit1).grid(row=0,column=0,padx=5,pady=10)
Button(f,text='計算器',command=submit2).grid(row=0,column=1,padx=5,pady=10)
Button(f,text='日曆',command=submit3).grid(row=0,column=2,padx=5,pady=10)
Button(f,text='日期計算',command=submit4).grid(row=0,column=3,padx=5,pady=10)
Button(f,text='備忘錄',command=submit5).grid(row=1,column=0,padx=5,pady=10)
Button(f,text='文件搜索',command=submit6).grid(row=1,column=1,padx=5,pady=10)
Button(f,text='秒錶',command=submit7).grid(row=1,column=2,padx=5,pady=10)
Button(f,text='LL1文法分析',command=submit8).grid(row=1,column=3,padx=5,pady=10)

 

發佈了47 篇原創文章 · 獲贊 54 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章