zoukankan      html  css  js  c++  java
  • Python: Tkinter、ttk编程之计算器

    起源:

    研究Python UI编程,我偏喜欢其原生组件,于是学习Tkinter、ttk组件用法。找一计算器开源代码,略加修整,以为备忘。
    其界面如图所示:

    1、源代码(Python 2.7):

    # encoding: UTF-8
    
    from Tkinter import *
    from ttk import *
    
    calc = Tk()
    calc.title('计算器')
    calc.resizable(False, False)
    
    buttons = [
        '7', '8', '9', '*', 'C',
        '4', '5', '6', '/', 'Neg',
        '1', '2', '3', '-', '$',
        '0', '.', '=', '+', '@']
    
    # set up GUI
    row = 1
    col = 0
    style = Style()
    style.configure('BW.TButton', padding=12)
    for i in buttons:
        action = lambda x=i: click_event(x)
        Button(calc, text=i, width=7, command=action, style='BW.TButton') 
            .grid(row=row, column=col, sticky='nesw', )
        col += 1
        if col > 4:
            col = 0
            row += 1
    
    display = Entry(calc, width=60)
    display.grid(row=0, column=0, columnspan=5)
    
    calc.update()
    w = calc.winfo_reqwidth()
    h = calc.winfo_reqheight()
    s_w = calc.winfo_screenwidth()
    s_h = calc.winfo_screenheight()
    calc.geometry('%dx%d+%d+%d' % (w, h, (s_w - w) / 2, (s_h - h) / 2))
    
    display.focus_set()
    
    def click_event(key):
        # = -> calculate results
        if key == '=':
            # safeguard against integer division
            if '/' in display.get() and '.' not in display.get():
                display.insert(END, '.0')
    
            # attempt to evaluate results
            try:
                result = eval(display.get())
                display.insert(END, ' = ' + str(result))
            except:
                display.insert(END, '   Error, use only valid chars')
    
                # C -> clear display
        elif key == 'C':
            display.delete(0, END)
    
    
        # $ -> clear display
        elif key == '$':
            display.delete(0, END)
            display.insert(END, '$$$$C.$R.$E.$A.$M.$$$$')
    
    
        # @ -> clear display
        elif key == '@':
            display.delete(0, END)
            display.insert(END, 'website')
    
    
        # neg -> negate term
        elif key == 'Neg':
            if '=' in display.get():
                display.delete(0, END)
            try:
                if display.get()[0] == '-':
                    display.delete(0)
                else:
                    display.insert(0, '-')
            except IndexError:
                pass
    
                # clear display and start new input
        else:
            if '=' in display.get():
                display.delete(0, END)
            display.insert(END, key)
    
    
    # RUNTIME
    calc.mainloop()

     

    2、生成exe

    反复对比py2exe及PyInstaller,发现py2exe在x64位下不能支持生成一个exe文件,而其在x32下,对Tkinter,也不能生成一个文件。

    费尽工夫,也只是少生成几个文件 ,甚为不爽:

    而用PyInstaller,可生成单一文件 。但验证其启动速度,甚为耗时:

    综合对比,Python做UI,实非方便之物,用其胶水语言之长处,足矣!

  • 相关阅读:
    【SCP-GO-100】梦 中 染
    【scp系列】SCP-4711 不便利便利店
    【scp系列】SCP-2298 塑料盒里的生活
    【scp系列】SCP-CN-1219 关云长大战外星人
    【scp系列】SCP-4444 以米斯达之名
    使用Ubuntu搭建Owncloud私有云
    python中函数的使用初步
    IOS自动化环境搭建踩坑指南
    接口测试工具apifox
    windowns上搭建vscode+node.js开发环境
  • 原文地址:https://www.cnblogs.com/crwy/p/7500670.html
Copyright © 2011-2022 走看看