首页 编程教程正文

tkinter之学习之路

piaodoo 编程教程 2020-02-22 22:14:04 1136 0 python教程

本文来源吾爱破解论坛

程序功能:
1.点击功能键;
2.实时回显输出;
3.清除数据功能;
4.未做日志记录。
运行如图:

xxxxxxxxxxx.png (48.83 KB, 下载次数: 0)

下载附件  保存到相册

2019-12-25 10:29 上传



代码如下:并未作出优化。
优化可参考链接 https://www.cnblogs.com/hhh5460/p/5188524.html

[Python] 纯文本查看 复制代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-


# tkinter_main.py
from tkinter import *
from tkinter import simpledialog, filedialog, messagebox
import operator, time, subprocess, sys, os, threading, datetime
#from PIL import ImageTk, Image

top = Tk()

class Application_Mian(Frame):
    def __init__(self):  # 主框架
        """
        在GUI中,每个Button、Label、输入框等,都是一个Widget(控件)。在tkinter中用Frame表示窗口,Frame也是一个Widget,Frame可以容纳其它Widget。本程序中从Frame类派生出Application类,来容纳各种Widget。
        Application类的构造函数 __init__(self,master=None)有两个参数,self代表Application本身,(在tkinter中,一个Widget可能属于另一个Widget,这时的另一个Widget就是这个控件的master)而窗口没有master,所以在这里master=None。
        geometry('800x430')表示将窗口大小设为“800x430”大小,self.createWidgets()是创建Widgets的方法,具体在后面。
        resizable(0, 0)表示不允许调节窗口大小,将参数设为1则表示允许调节。

        """
        Frame.__init__(self, master=None)
        image_bm = PhotoImage(file='image/background.png')
        self.master.geometry('1024x568')  # 设置程序启动默认大小
        self.master.resizable(width=False, height=False)  # 宽不可变, 高可变,默认为True
       # Label(self.master,image=image_bm)
        self.createWidgets()

    def createWidgets(self):
        '''增加菜单
        # tearoff的值有0和1,为0时表示子菜单不独立出来。)
        # add_cascade:添加下拉菜单
        '''
        self.menuBar = Menu(self.master)  ##创建菜单的实例
        self.master.config(menu=self.menuBar,bg='#CDCDB4')  # 将根窗口的顶级菜单设置为menu
        # 设置菜单选项
        # 创建一个下拉菜单‘关于’,这个菜单是挂在menubar(顶级菜单)上的
        # tearoff的值有0和1,为0时表示子菜单不独立出来。
        aboutMenu = Menu(self.menuBar, tearoff=0)
        # 创建一个下拉菜单‘功能’,这个菜单是挂在menubar(顶级菜单)上的
        moreMenu = Menu(self.menuBar, tearoff=0)
        # 创建一个下拉菜单‘预留功能1-4’,这个菜单是挂在menubar(顶级菜单)上的
        ReserveMenu1 = Menu(self.menuBar, tearoff=0)
        ReserveMenu2 = Menu(self.menuBar, tearoff=0)
        ReserveMenu3 = Menu(self.menuBar, tearoff=0)
        ReserveMenu4 = Menu(self.menuBar, tearoff=0)
        # add_cascade:添加下拉菜单
        self.menuBar.add_cascade(label='程序预留1', menu=ReserveMenu1)
        self.menuBar.add_cascade(label='程序预留2', menu=ReserveMenu2)
        self.menuBar.add_cascade(label='程序预留3', menu=ReserveMenu3)
        self.menuBar.add_cascade(label='程序预留4', menu=ReserveMenu4)
        self.menuBar.add_cascade(label='功能', menu=moreMenu)
        self.menuBar.add_cascade(label='帮助', menu=aboutMenu)
        # 下拉菜单的具体项目,使用add_command()方法
        aboutMenu.add_command(label='关于', command=self.AboutMenu)
        aboutMenu.add_command(label='退出', command=self.QuitMenu)
        moreMenu.add_command(label='其他', command=self.OtherMenu)
        # 预留按钮下拉框
        # ReserveMenu1
        ReserveMenu1.add_command(label='程序预留1', command=self.ReserveMenu)
        ReserveMenu1.add_command(label='程序预留2', command=self.ReserveMenu)
        ReserveMenu1.add_command(label='程序预留3', command=self.ReserveMenu)
        ReserveMenu1.add_command(label='程序预留4', command=self.ReserveMenu)
        # ReserveMenu2
        ReserveMenu2.add_command(label='程序预留1', command=self.ReserveMenu)
        ReserveMenu2.add_command(label='程序预留2', command=self.ReserveMenu)
        ReserveMenu2.add_command(label='程序预留3', command=self.ReserveMenu)
        ReserveMenu2.add_command(label='程序预留4', command=self.ReserveMenu)
        # ReserveMenu3
        ReserveMenu3.add_command(label='程序预留1', command=self.ReserveMenu)
        ReserveMenu3.add_command(label='程序预留2', command=self.ReserveMenu)
        ReserveMenu3.add_command(label='程序预留3', command=self.ReserveMenu)
        ReserveMenu3.add_command(label='程序预留4', command=self.ReserveMenu)
        # ReserveMenu4
        ReserveMenu4.add_command(label='程序预留1', command=self.ReserveMenu)
        ReserveMenu4.add_command(label='程序预留2', command=self.ReserveMenu)
        ReserveMenu4.add_command(label='程序预留3', command=self.ReserveMenu)
        ReserveMenu4.add_command(label='程序预留4', command=self.ReserveMenu)

        # 显示面板
        self.result = StringVar()
        self.result.set('执行结果')
        self.result2 = StringVar()
        self.result2.set('执行回显界面')

        # 显示面板设置
        #执行结果
        # #执行回显界面记录
        # ---------------------------------------------------------------------------------------------
        self.listbox1=Listbox(self.master,font=('微软雅黑', 10), bg='#CDCDB4', bd='0', fg='#828282',state=NORMAL)
        #下拉柱
        self.scrollbar_listbox1 = Scrollbar(self.listbox1)
        self.scrollbar_listbox1.pack(side=RIGHT, fill=Y)
        self.listbox1['yscrollcommand'] = self.scrollbar_listbox1.set

        self.listbox1.place( y=45, width=600, height=520)
        self.scrollbar_listbox1['command'] = self.listbox1.yview
        #---------------------------------------------------------------------------------------------
        # 日志记录
        #---------------------------------------------------------------------------------------------
        self.listbox2=Listbox(self.master,font=('微软雅黑', 10), bg='#CDCDB4', bd='0', fg='#828282',state=NORMAL)
        #下拉柱
        self.scrollbar_listbox2 = Scrollbar(self.listbox2)
        self.scrollbar_listbox2.pack(side=RIGHT, fill=Y)
        self.listbox2['yscrollcommand'] = self.scrollbar_listbox2.set
        self.listbox2.place(x=610, y=45, width=390, height=520)
        self.scrollbar_listbox2['command'] = self.listbox2.yview
        #---------------------------------------------------------------------------------------------

        """
        # 不带括号调用的结果:<function bracket at 0x0000000004DD0B38>,a是整个函数体,是一个函数对象,不须等该函数执行完成
        # 带括号调用的结果:6 ,b是函数执行后返回的值6,须等该函数执行完成的结果
        """
        self.Button1 = Button(self.master, text='功能键1', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,
                              command=lambda: self.thread_it( self.pressNum1), relief='raised')
        self.Button1.place(x=10, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键2', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2, command=lambda: self.thread_it(self.pressNum2), relief='raised')
        self.Button1.place(x=75, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键3', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.pressNum3), relief='raised')
        self.Button1.place(x=140, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键4', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.pressNum4), relief='raised')
        self.Button1.place(x=205, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键5', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.pressNum5), relief='sunken')
        self.Button1.place(x=270, y=10, width=60, height=30)

        # 第二排功能键
        self.Button1 = Button(self.master, text='功能键6', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.pressNum6), relief='sunken')
        self.Button1.place(x=335, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键7', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.pressNum7), relief='groove')
        self.Button1.place(x=400, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键8', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.pressNum8), relief='groove')
        self.Button1.place(x=465, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='功能键9', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda:self.thread_it(self.pressNum9), relief='ridge')
        self.Button1.place(x=530, y=10, width=60, height=30)

        self.Button1 = Button(self.master, text='清除数据', font=('微软雅黑', 10), fg=('#4F4F4F'), bg=('#FFFFF0'), bd=2,command=lambda: self.thread_it(self.Clr), relief='ridge')
        self.Button1.place(x=605, y=10, width=60, height=30)

        self.Clock_func = Label(self.master,text="%s" % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')),bg='#CDCDB4')
        self.Clock_func.place(x=700, y=10, width=300, height=30)
        self.Clock_func.after(1000, self.Clock)
    #-----------------------------------------------------------------
    def AboutMenu(self):
        messagebox.showinfo('关于', 'xxxxxx工具合集 \n \nQQ:xxxxxxx\n')

    def QuitMenu(self):
        messagebox.showinfo('退出', ' 暂时没有退出功能\n emmmm...')

    def OtherMenu(self):
        messagebox.showinfo('功能', ' 暂时没有其他功能\n emmmm...')

    def ReserveMenu(self):
        messagebox.showinfo('程序预留massage',
                            """暂时没有其他功能\n emmmm...\n  http://www.sevenday.cf """)

    #数据预存处理,按键后二次操作
    def Data_pre_processing(self,PressMenu):
        current_time = self.get_current_time()
        # for i in range(10):
        logmsg_in = str(current_time) + " " + PressMenu + ("执行完成")  +"\n"  # 换行
        #print("logggggggs Data_pre_processing ",logmsg_in)
        self.listbox2.insert(END, logmsg_in)

    #实时回显方法
    def Echo_in_real_time(self, bat_func):
        current_time = self.get_current_time()
        pi = subprocess.Popen(bat_func, shell=True, stdout=subprocess.PIPE)
        for i in iter(pi.stdout.readline, 'b'):
            time.sleep(0.3)
            if not i:
                break
            logmsg_in = str(current_time) + " " + str(i.decode('gbk')) + "\n"  # 换行
            self.listbox1.insert(END, logmsg_in)

    #时间戳
    def get_current_time(self):
        current_time = time.strftime('%Y-%m-%d %H:%M', time.localtime(time.time()))
        return current_time

    def Clock(self):
        self.Clock_func["text"] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.Clock_func.after(1000, self.Clock)
    #---------------------------------------------------------------------------------------
    # 功能键1
    def pressNum1(self):
        #messagebox.showinfo('功能1', ' 正在执行操作...')
        self.Echo_in_real_time("%cd%/bat/text1.bat")
        self.Data_pre_processing("按键1")

    # 功能键2
    def pressNum2(self):
        #messagebox.showinfo('功能2', ' 正在执行操作...')
        self.Echo_in_real_time("%cd%/bat/2.seting_IE_ActiveX_open.bat")
        self.Data_pre_processing("按键2")

    # 功能键3
    def pressNum3(self):
        #messagebox.showinfo('功能3', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键3")

    # 功能键4
    def pressNum4(self):
        #messagebox.showinfo('功能4', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键4")

    # 功能键5
    def pressNum5(self):
        #messagebox.showinfo('功能5', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键5")

    # 功能键6
    def pressNum6(self):
        #messagebox.showinfo('功能6', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键6")

    # 功能键7
    def pressNum7(self):
        #messagebox.showinfo('功能7', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键7")

    # 功能键8
    def pressNum8(self):
       # messagebox.showinfo('功能8', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键8")

    #功能键9
    def pressNum9(self):
       # messagebox.showinfo('功能9', ' 暂时没有其他功能\n emmmm...')
        self.Data_pre_processing("按键9")

    #清除记录
    def Clr(self):
        # app.result_set('等待程序输出...')  # 将运算结果显示到屏幕1
        # app.result2_set('归零中...')  # 将运算过程显示到屏幕2
        # lists.clear()  # 清空列表内容
        # messagebox.showinfo('Zeroing...', 'Zeroing... \n Please wait....')
        time.sleep(0.3)
        self.listbox1.delete(0,END)
        # self.listbox2.set('')
        self.Data_pre_processing("清除记录")
        messagebox.showinfo('清除记录', '回显界面清理成功\n 请继续使用....')
    # 打包进线程(耗时的操作)
    @staticmethod
    def thread_it(func, *args):
        t = threading.Thread(target=func, args=args)
        t.setDaemon(True)  # 守护--就算主界面关闭,线程也会留守后台运行(不对!)
        t.start()  # 启动
        # t.join()     # 阻塞--会卡死界面!


# 实例化Application()类
app = Application_Mian()
# 设置窗口标题:
app.master.title('xxxxxx工具合集')
# 主消息循环:
app.mainloop()


版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7867.html

搜索