Inhaltsverzeichnis
二、基本使用
1. 菜单(menu)
3. Tab页面(notebook)
4. 列表控件(ListCtrl)
五、学习资源
Heim Backend-Entwicklung Python-Tutorial 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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Python-GUI-Programmierung: Beginnen Sie schnell und erstellen Sie einfach interaktive Schnittstellen Python-GUI-Programmierung: Beginnen Sie schnell und erstellen Sie einfach interaktive Schnittstellen Feb 19, 2024 pm 01:24 PM

Eine kurze Einführung in die Python-GUI-Programmierung. GUI (Graphical User Interface, grafische Benutzeroberfläche) ist eine Möglichkeit, Benutzern die grafische Interaktion mit Computern zu ermöglichen. Unter GUI-Programmierung versteht man die Verwendung von Programmiersprachen zur Erstellung grafischer Benutzeroberflächen. Python ist eine beliebte Programmiersprache, die eine umfangreiche GUI-Bibliothek bietet und die Python-GUI-Programmierung sehr einfach macht. Einführung in die Python-GUI-Bibliothek Es gibt viele GUI-Bibliotheken in Python, von denen die am häufigsten verwendeten sind: Tkinter: Tkinter ist die GUI-Bibliothek, die mit der Python-Standardbibliothek geliefert wird. Sie ist einfach und benutzerfreundlich, verfügt jedoch über begrenzte Funktionen. PyQt: PyQt ist eine plattformübergreifende GUI-Bibliothek mit leistungsstarken Funktionen.

PHP-Studiennotizen: Datenstrukturen und Algorithmen PHP-Studiennotizen: Datenstrukturen und Algorithmen Oct 09, 2023 pm 11:54 PM

Anmerkungen zur PHP-Studie: Überblick über Datenstrukturen und Algorithmen: Datenstrukturen und Algorithmen sind zwei sehr wichtige Konzepte in der Informatik. Sie sind der Schlüssel zur Lösung von Problemen und zur Optimierung der Codeleistung. Bei der PHP-Programmierung müssen wir häufig verschiedene Datenstrukturen verwenden, um Daten zu speichern und zu verarbeiten, und wir müssen auch Algorithmen verwenden, um verschiedene Funktionen zu implementieren. In diesem Artikel werden einige häufig verwendete Datenstrukturen und Algorithmen vorgestellt und entsprechende PHP-Codebeispiele bereitgestellt. 1. Array mit linearer Struktur (Array) Array ist eine der am häufigsten verwendeten Datenstrukturen und kann zum Speichern geordneter Daten verwendet werden.

Ausführliche Erklärung der GUI-Bibliothek wxPython in Python Ausführliche Erklärung der GUI-Bibliothek wxPython in Python Jun 09, 2023 pm 10:00 PM

Python ist eine prägnante, leicht zu erlernende und effiziente Programmiersprache. Es wird häufig in verschiedenen Bereichen wie Datenwissenschaft, künstliche Intelligenz, Spieleentwicklung, Netzwerkprogrammierung usw. eingesetzt. Obwohl Python mit einigen GUI-Bibliotheken geliefert wird, sind ihre Funktionen relativ einfach und können die Anforderungen verschiedener komplexer Anwendungen nicht erfüllen. Daher stehen in Python viele GUI-Bibliotheken zur Auswahl, darunter wxPython, das in diesem Artikel ausführlich vorgestellt wird. Einführung in wxPython wxPython ist eine plattformübergreifende Open-Source-GUI-Bibliothek, die auf basiert

Python-GUI-Programmierung: Heben Sie Ihre Programme hervor Python-GUI-Programmierung: Heben Sie Ihre Programme hervor Feb 19, 2024 pm 08:33 PM

Einführung in die PythonGUI-Programmierung Bei der PythonGUI-Programmierung, also der grafischen Benutzeroberflächenprogrammierung, werden Anwendungsprogrammschnittstellen mithilfe der Python-Sprache erstellt. GUI-Anwendungen verfügen normalerweise über Elemente wie Fenster, Schaltflächen, Textfelder, Menüs usw., über die Benutzer mit dem Programm interagieren können. Die Python-GUI-Programmierung bietet viele Vorteile. Erstens kann es Ihr Programm schöner und benutzerfreundlicher machen. Zweitens kann es Ihr Programm plattformübergreifend machen, das heißt, es kann auf verschiedenen Betriebssystemen ausgeführt werden. Drittens kann es Ihr Programm flexibler und einfacher erweiterbar machen. Häufig verwendete Python-GUI-Bibliotheken In Python gibt es viele häufig verwendete GUI-Bibliotheken, darunter Tkinter, PyQt, wxPython und PyG

Die Kunst der Python-GUI-Programmierung: Schöne und benutzerfreundliche Schnittstellen erstellen Die Kunst der Python-GUI-Programmierung: Schöne und benutzerfreundliche Schnittstellen erstellen Feb 19, 2024 pm 05:36 PM

PythonGUI-Programmierung ist, wie der Name schon sagt, eine Programmiertechnologie, die die Python-Sprache verwendet, um eine grafische Benutzeroberfläche (GUI) zu erstellen. Die Python-GUI-Programmierung bietet viele Vorteile, z. B. plattformübergreifende Unterstützung, umfassende Unterstützung für Bibliotheken von Drittanbietern, präzise Syntax usw. Daher ist die Python-GUI-Programmierung bei Programmierern sehr beliebt und wird häufig in verschiedenen Arten der Anwendungsentwicklung eingesetzt. Bei der Python-GUI-Programmierung sind Tkinter, PyQt und wxPython die am häufigsten verwendeten Bibliotheken von Drittanbietern. Tkinter ist Teil der Python-Standardbibliothek und einfach und benutzerfreundlich, verfügt jedoch über eingeschränkte Funktionalität. PyQt und wxPython sind beide leistungsstarke GUI-Bibliotheken von Drittanbietern, aber sie sind noch mehr

Python-GUI-Programmierung: vom Anfänger bis zum Experten Python-GUI-Programmierung: vom Anfänger bis zum Experten Feb 20, 2024 am 10:50 AM

1. Grundlagen der Python-GUI-Programmierung Unter Python-GUI-Programmierung versteht man den Prozess der Erstellung einer grafischen Benutzeroberfläche (GUI) mithilfe der Python-Sprache. GUI ist die Schnittstelle für Benutzer zur Interaktion mit Anwendungen und besteht normalerweise aus Fenstern, Schaltflächen, Textfeldern, Listenfeldern und anderen Steuerelementen. Python bietet eine Vielzahl von GUI-Bibliotheken wie Tkinter, PyQt, wxPython usw. Diese Bibliotheken bieten umfangreiche Steuerelemente und Mechanismen zur Ereignisbehandlung, sodass Python-Programmierer auf einfache Weise schöne und praktische GUI-Anwendungen erstellen können. 2. Erste Schritte mit der PythonGUI-Programmierung Installieren der PythonGUI-Bibliothek Bevor Sie mit der GUI-Programmierung beginnen, müssen Sie zunächst die PythonGUI-Bibliothek installieren. Am Beispiel von Tkinter ist das möglich

Welche Optionen gibt es für GUI-Bibliotheken in Python? Welche Optionen gibt es für GUI-Bibliotheken in Python? Oct 27, 2023 pm 03:10 PM

Python ist eine leicht zu erlernende, leistungsstarke Programmiersprache, die sich für die Entwicklung in verschiedenen Bereichen eignet. In Python stehen zahlreiche Bibliotheken für grafische Benutzeroberflächen (GUI) zur Verfügung, die Entwicklern bei der Erstellung interaktiver Desktopanwendungen helfen. In diesem Artikel werden einige häufig verwendete Python-GUI-Bibliotheken vorgestellt und spezifische Codebeispiele bereitgestellt. Tkinter: Tkinter ist die Standard-GUI-Bibliothek von Python, die Funktionen zum Erstellen einfacher Fensteranwendungen bietet. Mit Tkinter können wir das ganz einfach

PHP-Studiennotizen: Entwicklung von Foren- und Blogsystemen PHP-Studiennotizen: Entwicklung von Foren- und Blogsystemen Oct 09, 2023 am 10:57 AM

PHP-Studiennotizen: Foren- und Blogsystementwicklung Im Bereich der Webentwicklung sind Foren und Blogsysteme weit verbreitete Anwendungen. Sie bieten Benutzern eine Plattform zur Kommunikation und zum Austausch von Informationen. In diesem Artikel besprechen wir, wie man mit PHP ein einfaches Forum- und Blogsystem entwickelt, und fügen spezifische Codebeispiele bei. Umgebungseinrichtung Zuerst müssen wir eine Entwicklungsumgebung einrichten, die für die PHP-Entwicklung geeignet ist. Wir können AMP-Pakete (Apache, MySQL und PHP) wie XAMPP oder WAM verwenden

See all articles