【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事

如何使用PythonWin

  1. 创建窗口
    • 使用Windows API创建窗口
      当窗口创建以后,使用win32gui.PumpMessages()进入无限消息循环,处理窗口消息。
      窗口消息首先传递给WndProc,在WndProc中可以定义相应消息的处理过程。
# -*- coding:utf-8 -*-
#
import win32gui
from win32con import *
# Windows Message Process Function
def WndProc(hwnd, msg, wParam, lParam):
    if msg == WM_PAINT:
        hdc,ps = win32gui.BeginPaint(hwnd)
        rect = win32gui.GetClientRect(hwnd)
        win32gui.DrawText(hdc,
            'GUI Python',
            len('GUI Python'),
            rect,
            DT_SINGLELINE|DT_CENTER|DT_VCENTER)
        win32gui.EndPaint(hwnd,ps)
    if msg == WM_DESTROY:
        win32gui.PostQuitMessage(0)
    return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)
# Generate Windows Class, and set the related item value
wc = win32gui.WNDCLASS()
wc.hbrBackground = COLOR_BTNFACE+1
wc.hCursor = win32gui.LoadCursor(0, IDC_ARROW)
wc.hIcon = win32gui.LoadIcon(0, IDI_APPLICATION)
wc.lpszClassName = "Python on Windows"
wc.lpfnWndProc = WndProc
# Register Windows Class
reg = win32gui.RegisterClass(wc)
# Create Window
hwnd = win32gui.CreateWindow(
        reg, 'Python', WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        0, 0, 0, None)
# Display Window
win32gui.ShowWindow(hwnd, SW_SHOWNORMAL)
win32gui.UpdateWindow(hwnd)
# Into MessageLoop, Util close the window
win32gui.PumpMessages()

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第1张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第2张图片
* 使用MFC创建窗口
首先,创建窗口类;然后,重载消息处理方法;最后类实例化,创建窗口。
当窗口创建以后,调用RunModalLoop方法进入窗口消息循环,否则窗口将立刻关闭。
使用EndModalLoop方法结束消息循环。

# -*- coding:utf-8 -*-
#
import win32ui
import win32api
from win32con import *
from pywin.mfc import window
# define windows class
class MyWnd(window.Wnd):
    def __init__(self):
        window.Wnd.__init__(self, win32ui.CreateWnd())
        self._obj_.CreateWindowEx(WS_EX_CLIENTEDGE,\
        win32ui.RegisterWndClass(0, 0, COLOR_WINDOW+1),\
        'MFC GUI', WS_OVERLAPPEDWINDOW,\
        (100, 100, 400, 300), None, 0, None)
    # reload OnClose Method
    def OnClose(self):
        self.EndModalLoop(0)    
    # reload OnPaint Method, which in windows print "MFC GUI"
    def OnPaint(self):
        dc, ps = self.BeginPaint()
        dc.DrawText("MFC GUI",
            self.GetClientRect(),
            DT_SINGLELINE|DT_CENTER|DT_VCENTER)
        self.EndPaint(ps)
w = MyWnd()
w.ShowWindow()
w.UpdateWindow()
w.RunModalLoop(1)

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第3张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第4张图片
2. 对话框
* 创建对话框


# -*- coding:utf-8 -*-
#
import win32ui
import win32con
from pywin.mfc import dialog
# define windows class
class MyDialog(dialog.Dialog):
    def OnInitDialog(self):
        dialog.Dialog.OnInitDialog(self)
style = (win32con.DS_MODALFRAME |
        win32con.WS_POPUP|
        win32con.WS_VISIBLE|
        win32con.WS_CAPTION|
        win32con.WS_SYSMENU|
        win32con.DS_SETFONT)
di = ['Python',
    (0,0,300,180),
    style,
    None,
    (8, 'MS Sans Serif')]
init = []
init.append(di)
mydialog = MyDialog(init)
mydialog.DoModal()

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第5张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第6张图片
* 向对话框中添加控件

import win32ui
import win32con
from pywin.mfc import dialog
# define windows class
class MyDialog(dialog.Dialog):
    def OnInitDialog(self):
        dialog.Dialog.OnInitDialog(self)
    def OnOK(self):
        win32ui.MessageBox('Press Ok',\
                          'Python',
                          win32con.MB_OK)
        self.EndDialog(1)
    def OnCancel(self):
        win32ui.MessageBox('Press Cancel',\
                          'Python',
                          win32con.MB_OK)
        self.EndDialog(1) 
style = (win32con.DS_MODALFRAME |
        win32con.WS_POPUP|
        win32con.WS_VISIBLE|
        win32con.WS_CAPTION|
        win32con.WS_SYSMENU|
        win32con.DS_SETFONT)
childstyle = (win32con.WS_CHILD|win32con.WS_VISIBLE)
buttonstyle = win32con.WS_TABSTOP|childstyle
di = ['Python',
    (0,0,300,180),
    style,
    None,
    (8, 'MS Sans Serif')]
ButOK = (['Button',
        "OK",
        win32con.IDOK,
        (80,150,50,14),
        buttonstyle|win32con.BS_PUSHBUTTON])
ButCancel = (['Button',
            "Cancel",
            win32con.IDCANCEL,
            (160,150,50,14),
            buttonstyle|win32con.BS_PUSHBUTTON])
Stadic=(['Static',
            "Python Dialog",
            12,
            (130, 50, 60, 14),
            childstyle])
Edit = (['Edit',
        "",
        13,
        (130, 80, 60, 14),
        childstyle|win32con.ES_LEFT|win32con.WS_BORDER|win32con.WS_TABSTOP])
init = []
init.append(di)
init.append(ButOK)
init.append(ButCancel)
init.append(Stadic)
init.append(Edit)
init.append
mydialog = MyDialog(init)
mydialog.DoModal()

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第7张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第8张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第9张图片
* 使用DLL文件中的资源
* 处理按钮消息

# -*- coding:utf-8 -*-
#
import win32ui
import win32con
from pywin.mfc import dialog
# define windows class
class MyDialog(dialog.Dialog):
    def OnInitDialog(self):
        dialog.Dialog.OnInitDialog(self)
        self.HookCommand(self.OnButton1, 1051)
        self.HookCommand(self.OnButton2, 1052)
    def OnButton1(self, wParam, lParam):
        win32ui.MessageBox('Button1', 'Python',win32con.MB_OK)
        self.EndDialog(1)
    def OnButton2(self, wParam, lParam):
        text = self.GetDlgItemText(1024)
        win32ui.MessageBox(text, 'Python', win32con.MB_OK)
        self.EndDialog(1)
style = (win32con.DS_MODALFRAME |
        win32con.WS_POPUP|
        win32con.WS_VISIBLE|
        win32con.WS_CAPTION|
        win32con.WS_SYSMENU|
        win32con.DS_SETFONT)
childstyle = (win32con.WS_CHILD|win32con.WS_VISIBLE)
buttonstyle = win32con.WS_TABSTOP|childstyle
di = ['Python',
    (0,0,300,180),
    style,
    None,
    (8, 'MS Sans Serif')]
Button1 = (['Button',
        "Button1",
        1051,
        (80,150,50,14),
        buttonstyle|win32con.BS_PUSHBUTTON])
Button2 = (['Button',
            "Button2",
            1052,
            (160,150,50,14),
            buttonstyle|win32con.BS_PUSHBUTTON])
Stadic=(['Static',
            "Python Dialog",
            12,
            (130, 50, 60, 14),
            childstyle])
Edit = (['Edit',
        "",
        13,
        (130, 80, 60, 14),
        childstyle|win32con.ES_LEFT|win32con.WS_BORDER|win32con.WS_TABSTOP])
init = []
init.append(di)
init.append(Button1)
init.append(Button2)
init.append(Stadic)
init.append(Edit)
mydialog = MyDialog(init)
mydialog.DoModal()

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第10张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第11张图片
3. 菜单
* 创建普通菜单

# -*- coding:utf-8 -*-
#
import win32ui
import win32api
from win32con import *
from pywin.mfc import window
# define windows class
class MyWnd(window.Wnd):
    def __init__(self):
        window.Wnd.__init__(self, win32ui.CreateWnd())
        self._obj_.CreateWindowEx(WS_EX_CLIENTEDGE,\
            win32ui.RegisterWndClass(0, 0, COLOR_WINDOW+1),\
            'MFC GUI', WS_OVERLAPPEDWINDOW,\
            (10, 10, 800, 500), None, 0, None)
        # 捕获右键单击消息
        submenu = win32ui.CreatePopupMenu()
        menu = win32ui.CreateMenu()
        submenu.AppendMenu(MF_STRING, 1051,'&Open')
        submenu.AppendMenu(MF_STRING, 1052,'&Close')
        submenu.AppendMenu(MF_STRING, 1053,'&Save')
        menu.AppendMenu(MF_STRING|MF_POPUP,submenu.GetHandle(),'&File')
        submenu = win32ui.CreateMenu()        
        submenu.AppendMenu(MF_STRING, 1054, '&Copy')
        submenu.AppendMenu(MF_STRING, 1055, '&Paste')
        submenu.AppendMenu(MF_SEPARATOR, 1056, None)
        submenu.AppendMenu(MF_STRING, 1057,'&Cut')
        menu.AppendMenu(MF_STRING|MF_POPUP, submenu.GetHandle(), '&Edit')
        submenu=win32ui.CreateMenu()
        submenu.AppendMenu(MF_STRING, 1058, 'Tools')
        submenu.AppendMenu(MF_STRING|MF_GRAYED, 1059, 'Setting')
        m = win32ui.CreateMenu()
        m.AppendMenu(MF_STRING|MF_POPUP|MF_CHECKED, submenu.GetHandle(),'Option')
        menu.AppendMenu(MF_STRING|MF_POPUP,m.GetHandle(),'&Other')
        self._obj_.SetMenu(menu)
    # reload OnClose Method
    def OnClose(self):
        self.EndModalLoop(0)
    # process the RClick event
w = MyWnd()
w.ShowWindow()
w.UpdateWindow()
w.RunModalLoop(1)

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第12张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第13张图片
* 创建弹出式菜单

# -*- coding:utf-8 -*-
#
import win32ui
import win32api
from win32con import *
from pywin.mfc import window
# define windows class
class MyWnd(window.Wnd):
    def __init__(self):
        window.Wnd.__init__(self, win32ui.CreateWnd())
        self._obj_.CreateWindowEx(WS_EX_CLIENTEDGE,\
            win32ui.RegisterWndClass(0, 0, COLOR_WINDOW+1),\
            'MFC GUI', WS_OVERLAPPEDWINDOW,\
            (10, 10, 800, 500), None, 0, None)
        # 捕获右键单击消息
        self.HookMessage(self.OnRClick, WM_RBUTTONDOWN)
    # reload OnClose Method
    def OnClose(self):
        self.EndModalLoop(0)
    # process the RClick event
    def OnRClick(self, param):
        submenu = win32ui.CreatePopupMenu()
        submenu.AppendMenu(MF_STRING, 1054, 'Copy')
        submenu.AppendMenu(MF_STRING, 1055, 'Paste')
        submenu.AppendMenu(MF_SEPARATOR, 1056, None)
        submenu.AppendMenu(MF_STRING, 1057, 'Cut')
        flag = TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON
        submenu.TrackPopupMenu(param[5], flag, self)  
w = MyWnd()
w.ShowWindow()
w.UpdateWindow()
w.RunModalLoop(1)

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第14张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第15张图片

* 使用DLL中的菜单
* 处理菜单消息
# -*- coding:utf-8 -*-
#
import win32ui
import win32api
from win32con import *
from pywin.mfc import window
# define windows class
class MyWnd(window.Wnd):
    def __init__(self):
        window.Wnd.__init__(self, win32ui.CreateWnd())
        self._obj_.CreateWindowEx(WS_EX_CLIENTEDGE,\
            win32ui.RegisterWndClass(0, 0, COLOR_WINDOW+1),\
            'MFC GUI', WS_OVERLAPPEDWINDOW,\
            (10, 10, 800, 500), None, 0, None)
        # create menu object
        submenu = win32ui.CreatePopupMenu()
        menu = win32ui.CreateMenu()
        # add sth into menu
        submenu.AppendMenu(MF_STRING, 1051,'&Open')
        submenu.AppendMenu(MF_STRING, 1052,'&Close')
        submenu.AppendMenu(MF_STRING, 1053,'&Save')
        menu.AppendMenu(MF_STRING|MF_POPUP,submenu.GetHandle(),'&File')     
        # add menu into window
        self._obj_.SetMenu(menu)
        # set menu process message
        self.HookCommand(self.MenuClick, 1051)
        self.HookCommand(self.MenuClick, 1052)
        self.HookCommand(self.MenuClick, 1053)
    # reload OnClose Method
    def OnClose(self):
        self.EndModalLoop(0)
    def MenuClick(self, lParam, wParam):
        if lParam == 1051:
            self.MessageBox('Open', 'Python', MB_OK)
        elif lParam == 1053:
            self.MessageBox('Save', 'Python', MB_OK)
        else:
            self.OnClose()
w = MyWnd()
w.ShowWindow()
w.UpdateWindow()
w.RunModalLoop(1)

【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第16张图片
【脚本语言系列】关于PythonGUI界面PythonWin,你需要知道的事_第17张图片

什么是PythonWin

PythonWin也是通过扩展的形式对MFC的函数进行封装的。
通过使用PythonWin中的win32gui和win32ui模块可以调用WindowsAPI,
或者使用MFC来创建GUI界面。

你可能感兴趣的:(脚本语言)