目錄
二、基本使用
1. 菜单(menu)
3. Tab页面(notebook)
4. 列表控件(ListCtrl)
五、学习资源
首頁 後端開發 Python教學 wxpython学习笔记(推荐查看)

wxpython学习笔记(推荐查看)

Jun 06, 2016 am 11:30 AM
wxpython 學習筆記

一、简介

wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序。它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。和Python语言与wxWidgets GUI工具库一样,wxPython是开源软件。这意味着任何人都可以免费地使用它并且可以查看和修改它的源代码,或者贡献补丁,增加功能。wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS X。由于使用Python作为编程语言,wxPython编写简单、易于理解。

二、基本使用

基本使用的话到这个地址看已经很详细了,我没有必要重复一遍啦:

http://wiki.wxpython.org/Getting%20Started

三、常用控件

1. 菜单(menu)

http://wiki.wxpython.org/Getting%20Started#head-33e6dc36df2a89db146142e9a97b6e36b956875f

2. 页面布局(Sizer)

这个东东使用起来比较麻烦,参考以下页面吧:

http://wiki.wxpython.org/Getting%20Started#head-7455553d71be4fad208480dffd53b7c68da1a982

wxPython frame的布局详细解释(一) 

wxPython frame的布局详细解释(二) 

3. Tab页面(notebook)

http://wiki.wxpython.org/Getting%20Started#head-b20d2fc488722cdb3f6193150293d1e118734db8

4. 列表控件(ListCtrl)

这个控件比较强大,是我比较喜欢使用的控件之一。在《wxPythonInAction》一书中第13章有介绍(想要该书电子版及附带源码的朋友可以问我要)

下面是list_report.py中提供的简单用法:

代码如下:


import wx
import sys, glob, random
import data

class DemoFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1,
                          "wx.ListCtrl in wx.LC_REPORT mode",
                          size=(600,400))

        il = wx.ImageList(16,16, True)
        for name in glob.glob("smicon??.png"):
            bmp = wx.Bitmap(name, wx.BITMAP_TYPE_PNG)
            il_max = il.Add(bmp)
        self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
        self.list.AssignImageList(il, wx.IMAGE_LIST_SMALL)

        # Add some columns
        for col, text in enumerate(data.columns):
            self.list.InsertColumn(col, text)

        # add the rows
        for item in data.rows:
            index = self.list.InsertStringItem(sys.maxint, item[0])
            for col, text in enumerate(item[1:]):
                self.list.SetStringItem(index, col+1, text)

            # give each item a random image
            img = random.randint(0, il_max)
            self.list.SetItemImage(index, img, img)

        # set the width of the columns in various ways
        self.list.SetColumnWidth(0, 120)
        self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(3, wx.LIST_AUTOSIZE_USEHEADER)


app = wx.PySimpleApp()
frame = DemoFrame()
frame.Show()
app.MainLoop()

对于ListCtrl控件,我要补充的几个地方是:

1. 如何获取选中的项目?

 最常用的方法就是获取选中的第一项:GetFirstSelected(),这个函数返回一个int,即ListCtrl中的项(Item)的ID。

 还有一个方法是:GetNextSelected(itemid),获取指定的itemid之后的第一个被选中的项,同样也是返回itemid。

 通过这两个方法,我们就可以遍历所有选中的项了:

代码如下:


GetNextSelecteditemid = self.list.GetFirstSelected()
while itemid -1:
        #Do something
        itemid = self.list.GetNextSelected(itemid)

如果要获取某一行,某一列的值,则通过下面的方法:

代码如下:


#获取第0行,第1列的值
itemtext = self.list.GetItem(0, 1).Text

2. 如何在选定项后添加右键菜单?

在__init__函数中,添加如下的事件绑定:
self.list.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)然后,添加OnContextMenu方法:

代码如下:


def OnContextMenu(self, event):
        if not hasattr(self, "popupStop"):
            self.popupStop = wx.NewId()
            self.popupPropery = wx.NewId()
            self.Bind(wx.EVT_MENU, self.OnPopupStop, id = self.popupStop)
            self.Bind(wx.EVT_MENU, self.OnPopupProperty, id = self.popupPropery)

        # 创建菜单
        menu = wx.Menu()
        itemStop = wx.MenuItem(menu, self.popupStop, "Stop")
        itemProperty = wx.MenuItem(menu, self.popupPropery, 'Property')

        menu.AppendItem(itemStop)
        menu.AppendItem(itemProperty)

        itemProperty.Enable(False)#默认让属性按钮变成无效状态

        if itemid == -1:#如果没有选中任何项
            itemStop.Enable(False)
        else:
            itemStop.Enable(False)
            itemProperty.Enable(True)
        #到这里才弹出菜单
        self.PopupMenu(menu)
        #最后注意销毁前面创建的菜单
        menu.Destroy()

5. 选择文件对话框(FileDialog)

使用起来非常简单:

代码如下:


dlg = wx.FileDialog(self,
                            message="Yes, select a place ",
                            wildcard="PNG(*.png)|*.png" ,
                            style=wx.SAVE
                            )
        savefile = ''
        if dlg.ShowModal() == wx.ID_OK:
            savefile = dlg.GetPath()
            try:
                os.remove(self.filename)
            except:
                pass
            self.img.SaveFile(savefile, wx.BITMAP_TYPE_PNG)
            self.filename = savefile
        dlg.Destroy()

6. 选择文件夹对话框(DirDialog)

代码如下:


dialog = wx.DirDialog(None, 'Choose a directory: ',
                              style = wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
        for itemid in range(self.list.GetItemCount()):
                self.savechart(itemid, graphpath)
dialog.Destroy()

四、一些技巧

1. 设置快捷键

比如,希望按F5执行某个操作,可以在__init__函数中使用如下方法:

代码如下:


acceltbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F5, self.btnrun.GetId())])
self.SetAcceleratorTable(acceltbl)

还有一种很常用的情况,就是按ESC键关闭窗口。我们知道,有一种非常简单的办法就是使用SetId(wx.ID_CANCEL)方法,如:

代码如下:


self.btncancel = wx.Button(self.panel1, -1, 'Cancel', wx.Point(380, 280))
self.btncancel.SetId(wx.ID_CANCEL)

这样,按ESC键时,将会关闭当前Dialog,注意!这里是说Dialog,即继承自wx.Dialog的窗口对象,对于wx.Frame使用SetId似乎没有效果。

2. 使用定时器timer
在《wxPythonInAction》18章有个例子,如下:

代码如下:


import wx
import time

class ClockWindow(wx.Window):
    def __init__(self, parent):
        wx.Window.__init__(self, parent)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(1000)

    def Draw(self, dc):
        t = time.localtime(time.time())
        st = time.strftime("%I:%M:%S", t)
        w, h = self.GetClientSize()
        dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
        dc.Clear()
        dc.SetFont(wx.Font(30, wx.SWISS, wx.NORMAL, wx.NORMAL))
        tw, th = dc.GetTextExtent(st)
        dc.DrawText(st, (w-tw)/2, (h)/2 - th/2)

    def OnTimer(self, evt):
        dc = wx.BufferedDC(wx.ClientDC(self))
        self.Draw(dc)

    def OnPaint(self, evt):
        dc = wx.BufferedPaintDC(self)
        self.Draw(dc)

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="wx.Timer")
        ClockWindow(self)
       

app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()

3. 使用多线程时你必须知道的:wx.CallAfter

 在wxpython中编写多线程案例时特别需要注意,线程中通知窗口对象更新状态时,必须使用wx.CallAfter。同样是18章的例子:

代码如下:


import wx
import threading
import random

class WorkerThread(threading.Thread):
    """
    This just simulates some long-running task that periodically sends
    a message to the GUI thread.
    """
    def __init__(self, threadNum, window):
        threading.Thread.__init__(self)
        self.threadNum = threadNum
        self.window = window
        self.timeToQuit = threading.Event()
        self.timeToQuit.clear()
        self.messageCount = random.randint(10,20)
        self.messageDelay = 0.1 + 2.0 * random.random()

    def stop(self):
        self.timeToQuit.set()

    def run(self):
        msg = "Thread %d iterating %d times with a delay of %1.4f\n" \
              % (self.threadNum, self.messageCount, self.messageDelay)
        wx.CallAfter(self.window.LogMessage, msg)

        for i in range(1, self.messageCount+1):
            self.timeToQuit.wait(self.messageDelay)
            if self.timeToQuit.isSet():
                break
            msg = "Message %d from thread %d\n" % (i, self.threadNum)
            wx.CallAfter(self.window.LogMessage, msg)
        else:
            wx.CallAfter(self.window.ThreadFinished, self)

           

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Multi-threaded GUI")
        self.threads = []
        self.count = 0

        panel = wx.Panel(self)
        startBtn = wx.Button(panel, -1, "Start a thread")
        stopBtn  = wx.Button(panel, -1, "Stop all threads")
        self.tc = wx.StaticText(panel, -1, "Worker Threads: 00")
        self.log = wx.TextCtrl(panel, -1, "",
                               style=wx.TE_RICH|wx.TE_MULTILINE)

        inner = wx.BoxSizer(wx.HORIZONTAL)
        inner.Add(startBtn, 0, wx.RIGHT, 15)
        inner.Add(stopBtn, 0, wx.RIGHT, 15)
        inner.Add(self.tc, 0, wx.ALIGN_CENTER_VERTICAL)
        main = wx.BoxSizer(wx.VERTICAL)
        main.Add(inner, 0, wx.ALL, 5)
        main.Add(self.log, 1, wx.EXPAND|wx.ALL, 5)
        panel.SetSizer(main)

        self.Bind(wx.EVT_BUTTON, self.OnStartButton, startBtn)
        self.Bind(wx.EVT_BUTTON, self.OnStopButton, stopBtn)
        self.Bind(wx.EVT_CLOSE,  self.OnCloseWindow)

        self.UpdateCount()

    def OnStartButton(self, evt):
        self.count += 1
        thread = WorkerThread(self.count, self)
        self.threads.append(thread)
        self.UpdateCount()
        thread.start()

    def OnStopButton(self, evt):
        self.StopThreads()
        self.UpdateCount()

    def OnCloseWindow(self, evt):
        self.StopThreads()
        self.Destroy()

    def StopThreads(self):
        while self.threads:
            thread = self.threads[0]
            thread.stop()
            self.threads.remove(thread)

    def UpdateCount(self):
        self.tc.SetLabel("Worker Threads: %d" % len(self.threads))

    def LogMessage(self, msg):
        self.log.AppendText(msg)

    def ThreadFinished(self, thread):
        self.threads.remove(thread)
        self.UpdateCount()
       

app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()

4. 需要在程序中启动另外一个GUI程序,而有不失去主窗口的焦点?
通常,我们调用os.popen运行其他外部程序是没有问题的。但是在wxpython中,将会让wx失去当前的焦点,即使得打开的程序成为了一个模式对话框。要解决这个问题可以使用wx自带的方法,wx.Execute。

代码如下:


wx.Execute('notepad')

五、学习资源

1. 官方:http://wiki.wxpython.org/FrontPage

2. 啄木鸟WIKI:http://wiki.woodpecker.org.cn/moin/WxPythonInAction

作者:CoderZh(CoderZh)
出处:http://coderzh.cnblogs.com

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Python GUI程式設計:快速上手,輕鬆打造互動式介面 Python GUI程式設計:快速上手,輕鬆打造互動式介面 Feb 19, 2024 pm 01:24 PM

pythonGUI程式設計簡述GUI(GraphicalUserInterface,圖形使用者介面)是一種允許使用者透過圖形方式與電腦互動的方式。 GUI程式設計是指使用程式語言來創建圖形使用者介面。 Python是一種流行的程式語言,它提供了豐富的GUI函式庫,使得PythonGUI程式設計變得非常簡單。 PythonGUI函式庫介紹Python中有許多GUI函式庫,其中最常用的有:Tkinter:Tkinter是Python標準函式庫中自帶的GUI函式庫,它簡單易用,但功能有限。 PyQt:PyQt是一個跨平台的GUI函式庫,它功能強大,

PHP學習筆記:資料結構與演算法 PHP學習筆記:資料結構與演算法 Oct 09, 2023 pm 11:54 PM

PHP學習筆記:資料結構與演算法概述:資料結構和演算法是電腦科學中非常重要的兩個概念,它們是解決問題和最佳化程式碼效能的關鍵。在PHP程式設計中,我們常常需要使用各種資料結構來儲存和操作數據,同時也需要使用演算法來實現各種功能。本文將介紹一些常用的資料結構和演算法,並提供對應的PHP程式碼範例。一、線性結構數組(Array)數組是最常用的資料結構之一,可以用來儲存有序的數據

Python中的GUI庫wxPython詳解 Python中的GUI庫wxPython詳解 Jun 09, 2023 pm 10:00 PM

Python是一種簡潔、易學、高效的程式語言。它廣泛應用於各種領域,如數據科學、人工智慧、遊戲開發、網路程式設計等。雖然Python自帶一些GUI函式庫,但他們的功能較為簡單,無法滿足各類複雜應用的需求。因此,Python中有許多GUI庫可供選擇,其中wxPython是其中一個,本文將詳細介紹。 wxPython簡介wxPython是一個開源、跨平台的GUI函式庫,它基

Python GUI程式設計 GUI程式設計:讓你的程式脫穎而出 Python GUI程式設計 GUI程式設計:讓你的程式脫穎而出 Feb 19, 2024 pm 08:33 PM

pythonGUI編程簡介PythonGUI編程,即圖形使用者介面編程,是使用Python語言創建應用程式介面的過程。 GUI應用程式通常具有視窗、按鈕、文字方塊、選單等元素,使用者可以透過這些元素與程式互動。 PythonGUI程式設計有很多好處。首先,它可以使你的程式更加美觀易用。其次,它可以使你的程式跨平台,即可以在不同的作業系統上運行。第三,它可以使你的程式更加靈活,更容易擴展。常用的PythonGUI函式庫在Python中,有多個常用的GUI函式庫,包括Tkinter、PyQt、wxPython和PyG

Python GUI程式設計的藝術:打造美觀易用的介面 Python GUI程式設計的藝術:打造美觀易用的介面 Feb 19, 2024 pm 05:36 PM

pythonGUI編程,顧名思義,就是利用Python語言來創建圖形使用者介面(GUI)的程式設計技術。 PythonGUI程式設計擁有眾多優勢,例如:跨平台性、豐富的第三方函式庫支援、簡潔的語法等。因此,PythonGUI程式設計深受廣大程式設計師的喜愛,並廣泛應用於各種類型的應用程式開發中。在PythonGUI程式設計中,最常用的第三方函式庫有Tkinter、PyQt和wxPython。 Tkinter是Python標準函式庫的一部分,它簡單易用,但功能有限。 PyQt和wxPython都是功能強大的第三方GUI函式庫,但它們也更加

Python GUI程式設計:從入門到精通 Python GUI程式設計:從入門到精通 Feb 20, 2024 am 10:50 AM

一、pythonGUI程式設計基礎PythonGUI程式設計是指使用Python語言建立圖形使用者介面(GUI)的過程。 GUI是使用者與應用程式互動的介面,通常由視窗、按鈕、文字方塊、列錶框等控制項組成。 Python提供了多種GUI函式庫,如Tkinter、PyQt、wxPython等,這些函式庫提供了豐富的控制和事件處理機制,讓Python程式設計師能夠輕鬆創建出美觀實用的GUI應用程式。二、PythonGUI程式設計入門安裝PythonGUI庫在開始GUI程式設計前,需要先安裝PythonGUI函式庫。以Tkinter為例,可以

Python中的GUI函式庫有哪些選擇? Python中的GUI函式庫有哪些選擇? Oct 27, 2023 pm 03:10 PM

Python是一種簡單易學、功能強大的程式語言,適用於各種領域的開發。在Python中,有多種圖形使用者介面(GUI)庫可供選擇,可協助開發人員建立互動式的桌面應用程式。本文將介紹一些常用的PythonGUI函式庫,並提供具體的程式碼範例。 Tkinter:Tkinter是Python的標準GUI庫,提供了創建簡單視窗應用程式的功能。使用Tkinter,我們可以輕

PHP學習筆記:論壇與部落格系統開發 PHP學習筆記:論壇與部落格系統開發 Oct 09, 2023 am 10:57 AM

PHP學習筆記:論壇與部落格系統開發在Web開發領域中,論壇和部落格系統是非常常見的應用程式。它們為用戶提供了一個交流和分享資訊的平台。在本篇文章中,我們將討論如何使用PHP開發一個簡單的論壇和部落格系統,並附上具體的程式碼範例。環境設定首先,我們需要建構一個適合PHP開發的開發環境。我們可以使用AMP(Apache、MySQL和PHP)軟體包,如XAMPP或WAM

See all articles