• python 调用 shell 命令,制作用户界面


    1. python调用shell指令: os.system

    格式为 os.system('command')

    import os
    os.system('make')
    flag0 = flag[0]; flag1 = flag[1]; flag2 = flag[2]; flag3 = flag[3]; flag4 = flag[4]
    os.system('echo %d %d %d %d %d > output/cin.massfit' % (flag0, flag1, flag2, flag3, flag4))
    os.system('./massfit.x < output/cin.massfit')
    

    如上,可以在 python 中命令 shell 编译其他 c++ 程序,然后运行该程序。值得注意的是上面的第 4 排,可以将 python 中的变量的值传给 shell。这样,可以用 python tinker 写一个用户界面,然后让用户在界面上点点点或者输入参数,再按某个键,底层的c++程序就去跑。我是这样给 c++ 程序添加界面的。

    2. python 制作用户界面

    tinker 模块可以制作简单的用户界面,我试过几个,录在这里

    2.1 文本编辑器

    # A simple text file editor
    
    from tkinter import *
    from tkinter.scrolledtext import ScrolledText
    
    def load():
        with open(filename.get()) as file:
            contents.delete('1.0', END)
            contents.insert(INSERT, file.read())
    
    def save():
        with open(filename.get(), 'w') as file:
            file.write(contents.get('1.0', END))
    
    top = Tk()
    top.resizable(False, False)
    top.title("Simple Editor")
    
    contents = ScrolledText()
    contents.pack( side = BOTTOM, expand=True, fill=BOTH)
    
    filename = Entry()
    filename.pack(side=LEFT, expand=True, fill=X)
    
    Button(text='Open', command=load).pack(side=LEFT)
    Button(text='Save', command=save).pack(side=LEFT)
    
    #ttk.Label(top, text="A Label").grid(column=0, row=0)
    
    mainloop()
    

    2.2 点击按键,文本改变

    # click a button and a text changes
    
    import tkinter as tk
    from tkinter import ttk
    
    win = tk.Tk()
    
    win.title("Python GUI")
    
    a_label = ttk.Label(win, text="A Label")
    a_label.grid(column=0, row=0)
    
    def click_me():
        action.configure(text="** I have been Clicked! **")
        a_label.configure(foreground='red')
        a_label.configure(text='A Red Label')
        
    action = ttk.Button(win, text="Click Me!", command=click_me)
    action.grid(column=1, row=0)
    
    win.mainloop()
    

    2.3 输入人名,自动打招呼

    # Input a name and say hello to the person
    
    import tkinter as tk
    from tkinter import ttk
    
    win = tk.Tk()
    
    def click_me():
        action.configure(text='Hello ' + name.get())
        # the button click event is a callback function
    ttk.Label(win, text="Enter a name:").grid(column=0, row=0)
    
    action = ttk.Button(win, text="Click Me!", command=click_me)
    action.grid(column=1, row=1)
    action.configure(state='disabled') # Disable the Button Widget
    
    name = tk.StringVar() # Note: tk.StringVar
    name_entered = ttk.Entry(win, width=12, textvariable=name)
    name_entered.grid(column=0, row=1)
    
    name_entered.focus()
    
    win.mainloop()
    

    2.4 还有点问题的画图界面

    import tkinter
    
    from matplotlib.backends.backend_tkagg import (
        FigureCanvasTkAgg, NavigationToolbar2Tk)
    # Implement the default Matplotlib key bindings.
    from matplotlib.backend_bases import key_press_handler
    from matplotlib.figure import Figure
    
    import numpy as np
    
    
    root = tkinter.Tk()
    root.wm_title("Embedding in Tk")
    
    fig = Figure(figsize=(5, 4), dpi=100)
    t = np.arange(0, 3, .01)
    fig.add_subplot(111).plot(t, 2 * np.sin(2 * np.pi * t))
    
    canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    
    # pack_toolbar=False will make it easier to use a layout manager later on.
    toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False)
    toolbar.update()
    
    canvas.mpl_connect(
        "key_press_event", lambda event: print(f"you pressed {event.key}"))
    canvas.mpl_connect("key_press_event", key_press_handler)
    
    button = tkinter.Button(master=root, text="Quit", command=root.quit)
    
    # Packing order is important. Widgets are processed sequentially and if there
    # is no space left, because the window is too small, they are not displayed.
    # The canvas is rather flexible in its size, so we pack it last which makes
    # sure the UI controls are displayed as long as possible.
    button.pack(side=tkinter.BOTTOM)
    toolbar.pack(side=tkinter.BOTTOM, fill=tkinter.X)
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
    
    tkinter.mainloop()
    

    2.5 最后是原子核质量液滴模型拟合界面,需要搭配我写的 c++ 拟合程序使用

    #coding=utf-8
    import os
    # Liquid Drop Model, fit the AME2012 mass data with (optionally) these terms:
    # volume, surface, symmetry, Coulumb, pairing
    import matplotlib
    matplotlib.use('TkAgg') # matplotlib 后端设置为 TkAgg,才能与 tkinter 一致
    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 设置 canvas
    from matplotlib.figure import Figure # 声明 Figure
    from tkinter import *
    
    root = Tk() # Tk 实例
    root.title("Residual error of liquid drop model of nuclear masses") # title
    
    f = Figure(figsize=(8,5), dpi=100)
    fplot = f.add_subplot(111)
    
    def _destroyWindow():
        root.quit()
        root.destroy()
    
    color = ['#d9d9d9','green']; flag=[0,0,0,0,0]
    def volume():
        flag[0] = ( flag[0]+1 )%2 # jump between 0,1
        button0.config(bg = color[flag[0]], activebackground=color[flag[0]])
    def surface():
        flag[1] = ( flag[1]+1 )%2
        button1.config(bg = color[flag[1]], activebackground=color[flag[1]])
    def symmetry():
        flag[2] = ( flag[2]+1 )%2
        button2.config(bg = color[flag[2]], activebackground=color[flag[2]])
    def coulomb():
        flag[3] = ( flag[3]+1 )%2
        button3.config(bg = color[flag[3]], activebackground=color[flag[3]])
    def pairing():
        flag[4] = ( flag[4]+1 )%2
        button4.config(bg = color[flag[4]], activebackground=color[flag[4]])
    def cal_Bres():
        # run c++ code and get data
        os.system('make')
        flag0 = flag[0]; flag1 = flag[1]; flag2 = flag[2]; flag3 = flag[3]; flag4 = flag[4]
        os.system('echo %d %d %d %d %d > output/cin.massfit' % (flag0, flag1, flag2, flag3, flag4))
        os.system('./massfit.x < output/cin.massfit')
    def draw_ZBres():
        cal_Bres()
        data = np.loadtxt("output/res.txt")
        Z = data[:,0]; N = data[:, 1]; A = data[:, 2]; Bres = data[:, 3]
        fplot.clear(); fplot.set_xlabel("Z"); fplot.set_ylabel("Bres = Bexp. - Bth. (MeV)")
        fplot.scatter(Z,Bres,s=1); canvs.draw()
    def draw_NBres():
        cal_Bres()
        data = np.loadtxt("output/res.txt")
        Z = data[:,0]; N = data[:, 1]; A = data[:, 2]; Bres = data[:, 3]
        fplot.clear(); fplot.set_xlabel("Z"); fplot.set_ylabel("Bres = Bexp. - Bth. (MeV)")
        fplot.scatter(N,Bres,s=1); canvs.draw()
    
    canvs = FigureCanvasTkAgg(f,root)
    canvs.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
    button0 = Button(root, text='volume', command=volume); button0.pack(side=LEFT)
    button1 = Button(root, text="surface", command=surface); button1.pack(side=LEFT)
    button2 = Button(root, text="symmetry", command=symmetry); button2.pack(side=LEFT)
    button3 = Button(root, text="coulomb", command=coulomb); button3.pack(side=LEFT)
    button4 = Button(root, text="pairing", command=pairing); button4.pack(side=LEFT)
    button_draw_ZBres = Button(root, text="Bres v.s. Z", command=draw_ZBres).pack(side=LEFT)
    button_draw_ZBres = Button(root, text="Bres v.s. N", command=draw_NBres).pack(side=LEFT)
    
    root.mainloop()
    
  • 相关阅读:
    JAVA高级篇(二、JVM内存模型、内存管理之第二篇)
    JAVA高级篇(三、JVM编译机制、类加载机制)
    spring batch (二) 元数据表
    spring batch (一) 常见的基本的概念介绍
    ORACLE——EXTRACT() 截取日期时间的函数使用
    ORACLE——NVL()、NVL2() 函数的用法
    ORACLE删除分区
    ORACLE中关于使用between在MyBatis中取不同的区间值和取反
    ORACLE——count() 统计函数的使用
    Oracle——trunc()函数的使用
  • 原文地址:https://www.cnblogs.com/luyi07/p/15479048.html
Copyright © 2020-2023  润新知