用pyui4win快速開發小妞會裝機

目錄

  • 分析小妞會裝機
  • 創建項目
  • 用pyui4win designer設計界面
  • 用pyui4win designer生成界面代碼
  • 運行程序
  • 項目組織
  • 修改界面邏輯
  • 調試程序
  • 發佈程序
  • 要注意的問題

分析小妞會裝機

接下來咱們會用pyui4win開發一個功能和界面都與小妞會裝機同樣的軟件。首先看看小妞會裝機的界面和功能。 界面很簡潔,只有三個界面:系統選擇界面,鏡像下載界面和系統安裝界面。界面和功能以下: c++

第一個界面:系統選擇界面。在該界面選擇安裝xp仍是win7。當能夠點擊須要安裝的系統後,進入鏡像下載界面。

選擇系統

第二個界面:鏡像下載界面。當鏡像下載時,進度條給出相應的進度提示。當鏡像下載完成好,進入系統安裝界面。

下載鏡像

第三個界面:系統安裝界面。點擊開始安裝。程序將自動從新啓動並全自動安裝xp或win7。這樣一個嶄新的系統就安裝完成了。

完成安裝

創建項目

將Tamplate拷貝到d盤下,並更名爲netwin,這個目錄就是新的項目目錄,執行Launcher.exe能夠看到一個簡單帶動畫的窗口。Tamplate其實是一個 帶動畫界面的多線程python演示。如今咱們用pycharm創建netwin工程,並調試起來。 git

1. 創建開發環境:首先安裝python2.7.4版本,而後安裝pycharm2.6。

在pycharm中選擇file->open dirctory...,選擇D:\netwin。而後在左邊展開netwin項目 github

netwin

選擇DebugEntry.py,如圖中選擇Debug "DebugEntry.py", 一個界面出來了。選擇執行時,動畫開啓,開始轉圈,直到python功能函數執行完成。在執行過程當中,界面上的信息也在不斷更新。最後動畫中止。 多線程

執行效果

固然,這個界面不是咱們想要的。接下來咱們將它改成咱們須要的界面。 python2.7

用pyui4win designer設計界面

pyui4win中,界面是有xml文件來配置的。主界面爲MainFrame.xml。若是你很熟悉界面控件元素,能夠手動來編寫該文件。 pyui4win designer是一個可視化的界面配置工具,是pyui4win開源項目的一部分。你能夠用它來快速的配置界面。 函數

如何設計界面請參看本站上的 pyui4win designer界面設計教程

這個示例中,最快的方法是安裝小妞會裝機,而後直接提取小妞會裝機的皮膚文件。覆蓋到d:\netwin\skin。若是你的系統是win7,那麼將UIMainWin7.xml更名爲MainFrame.xml。 若是是xp,那麼將UIMainXP.xml更名爲MainFrame.xml。如下是在win7上,小妞會裝機的界面配置文件。 工具

這個界面中,ContainerUIStep1,ContainerUIStep2,ContainerUIStep3用外面套一個TabLayout會更合理。

UIMainWin7.xml和UIMainXP.xml文件中,只有字體部分不一樣。xp下用的是宋體,win7用的是微軟雅黑。 開發工具

<Window size="1024,576" caption="0,0,0,60">
    <Font name="微軟雅黑" size="19" bold="false" italic="false" ></Font>
    <Font name="微軟雅黑" size="16" bold="false" italic="false" ></Font>
    <Font name="微軟雅黑" size="14" bold="false" italic="false" ></Font>
    <VerticalLayout name="VerticalLayoutUI1" width="427" height="153" bkimage="vistabg.png">
        <Container name="ContainerUITitle" width="1022" height="114">
            <Label name="LabelUIDescription" text="您想安裝哪一個系統 ?" float="true" pos="141,48,0,0" width="618" height="66" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" font="0" ></Label>
            <Button name="BtnClose" tooltip="退出程序" float="true" pos="989,0,0,0" width="27" height="22" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='sys_button_close.png' source='27,0,53,22'" hotimage="file='sys_button_close.png' source='54,0,80,22'" ></Button>
            <Label name="LabelUI6" text="小妞會裝機" float="true" pos="63,18,0,0" width="279" height="23" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" font="1" ></Label>
            <Label name="LabelUI4" float="true" pos="10,7,0,0" width="48" height="48" bkimage="xiaoniu48.png" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" ></Label>
        </Container>
        <Container name="ContainerUIStep2" width="1023" height="291">
            <Label name="LabelUIOS" float="true" pos="416,50,0,0" width="182" height="137" bkimage="file='win7.jpg' hole='true'" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" ></Label>
            <Progress name="ProgressDownload" float="true" pos="195,220,0,0" width="603" height="33" bordercolor="#00008000" focusbordercolor="#000000FF" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" foreimage="progress.png" min="0" max="100" value="20" hor="true" ></Progress>
            <Label name="LabelWaiting" text="已經下載20%, 請耐心等待..." float="true" pos="416,221,0,0" width="373" height="30" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" ></Label>
            <Button name="BtnDownloadTooSlow" text="{u}{l}下載太慢?讓下載飛起來!{/l}{/u}" float="true" pos="195,262,0,0" width="398" height="22" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" showhtml="true" align="left"></Button>
        </Container>
        <Container name="ContainerUIStep1" width="1023" height="291">
            <Button name="BtnWin7" tooltip="點擊安裝win 7" float="true" pos="587,68,0,0" width="182" height="137" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="win7.jpg" hotimage="win7-hot.jpg" pushedimage="win7-push.jpg" ></Button>
            <Button name="BtnXP" tooltip="點擊安裝xp" float="true" pos="260,68,0,0" width="182" height="137" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="xp.jpg" hotimage="xp-hot.jpg" pushedimage="xp-push.jpg" ></Button>
            <Label name="LabelUI5" text="將鼠標移動到您想安裝的系統桌面圖像上並點擊。" float="true" pos="139,241,0,0" width="662" height="24" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" font="2" ></Label>
            <Label name="LabelUI2" text="XP: 流行了10年的經典系統" float="true" pos="262,30,0,0" width="181" height="27" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" font="2" ></Label>
            <Label name="LabelUI3" text="Win 7: 更炫的新系統" float="true" pos="589,30,0,0" width="269" height="30" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" font="2" ></Label>
        </Container>
        <Container name="ContainerUIStep3" width="1023" height="291">
            <Label name="LabelUI12" float="true" pos="366,2,0,0" width="256" height="256" bkimage="Vista.png" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" ></Label>
            <Label name="LabelUI11" text="下載已經完成。按開始安裝按鈕開始安裝。安裝過程當中會自動重啓動計算機。" float="true" pos="139,245,0,0" width="662" height="24" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" font="2" ></Label>
        </Container>
        <Container name="ContainerUIBottom" width="1023" height="169">
            <Button name="ButtonUIReboot" visible="false" text="開始安裝" float="true" pos="310,44,0,0" width="387" height="53" textcolor="#00FFFBF0" disabledtextcolor="#FFA7A6AA" font="0" align="center" normalimage="reboot.png" hotimage="reboot-hot.png" pushedimage="reboot.png" focusedimage="reboot.png" ></Button>
            <Button name="adv1" visible="false" float="true" pos="19,15,0,0" width="181" height="143" bordercolor="#0000FF00" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" ></Button>
			<Button name="adv2" visible="false" float="true" pos="219,15,0,0" width="181" height="143" bordercolor="#0000FF00" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" ></Button>
			<Button name="adv3" visible="false" float="true" pos="419,15,0,0" width="181" height="143" bordercolor="#0000FF00" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" ></Button>
			<Button name="adv4" visible="false" float="true" pos="619,15,0,0" width="181" height="143" bordercolor="#0000FF00" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" ></Button>
			<Button name="adv5" visible="false" float="true" pos="819,15,0,0" width="181" height="143" bordercolor="#0000FF00" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" ></Button>
		</Container>
    </VerticalLayout>
</Window>

用pyui4win designer生成界面代碼

在pyui4win designer中,選擇生成python類。pyui4win designer會根據界面配置文件,自動生成該界面對應的處理類。它會自動生成界面元素代碼和部分事件處理。 如下代碼就是自動生成的代碼。

# coding=gbk
__author__ = 'generated by py-ui4win'

import string, os, time

from PyUI import *
from MsgBox import *
from PyFrameBase import *
import UICommon
from CommonUtil import CommonUtils

class MainFrame(PyFrameBase):
    def __init__(self):
        super(MainFrame, self).__init__()
        self.clsName = self.__class__.__name__
        self.skinFileName = self.__class__.__name__ + '.xml'

    # 不要改動
    def GetSkinFile(self):
        return self.skinFileName

    # 不要改動
    def GetWindowClassName(self):
        return self.clsName

    # 退出處理
    def OnExit(self, sendor, wParam, lParam):
        self.ExitApp()

    # 準備顯示前的處理
    def OnPrepare(self, sendor, wParam, lParam):
        self.LabelUIDescription = self.PyFindLabel("LabelUIDescription")
        self.LabelUI6 = self.PyFindLabel("LabelUI6")
        self.LabelUI4 = self.PyFindLabel("LabelUI4")
        self.LabelUIOS = self.PyFindLabel("LabelUIOS")
        self.LabelWaiting = self.PyFindLabel("LabelWaiting")
        self.LabelUI5 = self.PyFindLabel("LabelUI5")
        self.LabelUI2 = self.PyFindLabel("LabelUI2")
        self.LabelUI3 = self.PyFindLabel("LabelUI3")
        self.LabelUI12 = self.PyFindLabel("LabelUI12")
        self.LabelUI11 = self.PyFindLabel("LabelUI11")
        self.BtnDownloadTooSlow = self.PyFindButton("BtnDownloadTooSlow")
        self.BtnWin7 = self.PyFindButton("BtnWin7")
        self.BtnXP = self.PyFindButton("BtnXP")
        self.ButtonUIReboot = self.PyFindButton("ButtonUIReboot")
        self.adv1 = self.PyFindButton("adv1")
        self.adv2 = self.PyFindButton("adv2")
        self.adv3 = self.PyFindButton("adv3")
        self.adv4 = self.PyFindButton("adv4")
        self.adv5 = self.PyFindButton("adv5")
        self.ProgressDownload = self.PyFindProgress("ProgressDownload")
        self.ContainerUITitle = self.PyFindContainer("ContainerUITitle")
        self.ContainerUIStep2 = self.PyFindContainer("ContainerUIStep2")
        self.ContainerUIStep1 = self.PyFindContainer("ContainerUIStep1")
        self.ContainerUIStep3 = self.PyFindContainer("ContainerUIStep3")
        self.ContainerUIBottom = self.PyFindContainer("ContainerUIBottom")
        self.VerticalLayoutUI1 = self.PyFindVerticalLayout("VerticalLayoutUI1")

    # 界面事件處理
    def OnNotify(self, sendor, sType, wParam, lParam):
        # 用戶點擊事件
        if sType == DUI_MSGTYPE_CLICK:
            if sendor == "BtnDownloadTooSlow":
                pass
            elif sendor == "BtnWin7":
                pass
            elif sendor == "BtnXP":
                pass
            elif sendor == "ButtonUIReboot":
                pass
            elif sendor == "adv1":
                pass
            elif sendor == "adv2":
                pass
            elif sendor == "adv3":
                pass
            elif sendor == "adv4":
                pass
            elif sendor == "adv5":
                pass

        # 用戶選擇事件
        if sType == DUI_MSGTYPE_ITEMSELECT:
            pass

運行程序

將生成的MainFrame.py文件拷貝到d:\netwin,運行DebugEntry.py或Launcher.exe,就能夠看到小妞會裝機的軟件界面出來了。

項目組織

好了。如今讓咱們回過頭來看看pyui4win是如何組織項目的。在pyui4win中,存在python開發模式和win原生髮布模式。前者是在開發中使用,DebugEntry.py是調試入口, 這可讓項目的開發方式和普通的python項目的開發方式沒有區別,此時須要依賴電腦上的python環境。; 後者是測試或發佈使用,Launcher.exe是執行入口。此時python是做爲嵌入語言嵌到c++程序中, pyui4win已經只帶python環境,因此再也不須要依賴電腦上的python環境。

在pyui4win中, 界面配置文件和界面資源都放在skin目錄中,主界面爲MainFrame.xml。每一個界面xml配置對應一個相同名稱的py文件, 該py文件中有一個相同名稱的python處理類。好比MsgBox.xml對應MsgBox.py,msgbox.py中定義了一個MsgBox類。 其中,MsgBox.py放在最頂層目錄下。

將全部自定義py文件都放在最頂層目錄下顯得有點亂,最好將它們都放在python27.zip中。並且我相信必定能夠這麼作。但我尚未找到這個方法。若是恰巧你知道,請告訴我。謝謝啦。

若是想建立並顯示一個窗口,那麼用如下代碼來實現:

pyFrameObj = PyFrameCreator()
    #將MainFrame改成你想建立的窗口的配置文件名
    obj = pyFrameObj.CreateForm(0, 'MainFrame', 'MainFrame', 'pyui4win界面示例')
    #obj.YouDefinedFun() #能夠先執行你定義的函數
    pyFrameObj.Show()

編寫界面邏輯

用pyui4win designer自動生成的代碼,運行能夠看到小妞會裝機的軟件界面出來了,可是能夠看到ContainerUIStep2, 可是它應該隱藏。那麼咱們須要處理。有兩種方法能夠解決這個問題。

1. 在OnPrepare加入隱藏ContainerUIStep2和ContainerUIStep3的代碼或者。

self.ContainerUIStep2.SetVisible(False)
        self.ContainerUIStep3.SetVisible(False)
用代碼實現界面會先顯示ContainerUIStep2而後在隱藏它,形成界面閃爍,不推薦。

2. 修改界面xml。直接隱藏ContainerUIStep2和ContainerUIStep3

<Container name="ContainerUIStep1" width="1023" height="291" visible="false">
          ...
        <Container name="ContainerUIStep1" width="1023" height="291" visible="false">
不要使用ctyps中的界面相關函數,不然會致使程序崩潰。該緣由尚未找到。可是,針對經常使用的界面函數,如MessageBox等,請使用PyWinUtils類中的對應函數

調試程序

一個重要的問題是如何調試程序。這時候你須要進入python開發模式。此時pyui4win是一個python擴展。 DebugEntry.py是調試入口。

在pycharm中打開MainFrame.py, 在須要調試的地方按Ctrl+F8,好比self.ContainerUIStep2.SetVisible(False)這句話,而後以下圖選擇 Debug "DebugEntry.py",你會發現如今停在了調試的地方。

netwin

若是程序須要以管理員權限執行,將開發工具以管理員權限啓動便可。

發佈程序

程序調試完成,如何測試和發佈呢?咱們不但願用戶的電腦上必須先安裝一個python環境才能執行, 並且咱們也不但願用戶直接執行DebugEntry.py文件。這樣很不專業。pyui4win的win原生髮布模式已經幫你解決了這個問題。 在這種模式中,pyui4win再也不是做爲python的擴展,而是反過來,python是做爲嵌入語言嵌到c++程序中,而c++宿主 程序就是Launcher.exe。因此,只須要直接執行Launcher.exe便可。

要注意的問題

在pyui4win中,請不要使用ctyps中的界面相關函數,不然會致使程序崩潰。該緣由尚未找到。 做爲一種解決方案,咱們如今PyWinUtils中封裝了這些經常使用的界面函數,如MessageBox等。 因此,若是想使用ctyps中的界面相關函數,請使用PyWinUtil類中的對應函數。

若是你知道是什麼緣由致使了該問題,請告訴我。但願你們一塊兒,把pyui4win項目作的愈來愈好。

相關文章
相關標籤/搜索