How to use wxPython for Python 3?
I installed wxPython 3.0.1.1 , but I’m unable to import wx using Python 3.4.1 . I am getting the following error:
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import wx Traceback (most recent call last): File "", line 1, in ImportError: No module named 'wx'
Python 2.7.5 (default, Mar 9 2014, 22:15:05) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import wx >>>
Maybe you need to add the module’s location manually to your sys.path : sys.path.insert(«/location/of/wx») Here is a more detailed description: stackoverflow.com/questions/279237/…
This is just a workaround, though. So I wont post it as an answer. Refer to the package’s distributor if you need a clean solution. Installing it should put the packages in the correct location or extend the paths correctly.
@jotrocken thanks, the problem is I don’t know the correct location where to install wx for python 3. Do you have any idea?
5 Answers 5
You have two different pythons installed on your machine (3.4.1 and 2.7.5). Do not expect to be able to use one package installed in one python (wxPython 3.0.1.1 at python 2.7.5) automatically to be available in another python.
Additionally wxPython (classic) does not work for Python 3. You need wxPython Phoenix to be able to do that.
EDIT: The recommended way (by @RobinDunn) to install wxPython (the Phoenix variety which will work on 2.7 and 3, now hosted on PyPI) nowadays is just doing:
If you have the developer version installed, just do the following beforehand:
pip uninstall wxPython_Phoenix
You can try to install one of the wxPython Phoenix snapshots in your Python 3.4.1. However, mind that Phoenix is not 1000% compatible with classic and you may experience the one or another hiccup when reusing classic code (but transitioning its doable and worth it).
You can find a complete explanation/description in the following wxPython wiki at the following link:
There are several important points:
- that pip / setuptool is new enough (> 6.x.x/> 12.x.x)
- that the builds are «inofficial», and thus pip refuses to install it: basically you need to add —pre when installing with pip.
- that you waive SSL verification —trusted-host wxpython.org (no longer needed in modern versions where https now works properly).
Full command for Windows machines:
C:\python27\scripts\pip.exe install --upgrade --pre -f https://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix
Note that this will install wxPython Phoenix for Python 2.7.
Знакомство с wxPython. Часть первая. Первые шаги
Когда-то я вам уже рассказывал о связке Ruby/Tk. Сегодня я собираюсь продолжить знакомство с «быстрыми интерфейсами». На этот раз я расскажу вам о wxPython, а писать мы будем на Python.
На самом деле, wxPython является лишь обёрткой для библиотеки wxWidgets, который в свою очередь представляет графический тулкит, который позволяет писать кроссплатформенные приложения.
Что же такое xWidgets
wxWidgets (ранее известная как wxWindows) — это кросс-платформенная библиотека инструментов с открытым исходным кодом для разработки кроссплатформенных на уровне исходного кода приложений, в частности для построения графического интерфейса пользователя (GUI).
Она разработана не только для того, чтобы создавать GUI. Она также имеет набор классов для работы с графическими изображениями, HTML, XML документами, архивами, файловыми системами, процессами, подсистемами печати, мультимедиа, сетями, классы для организации многопоточности, отладки, отправки дампов и множество других инструментов.
Итак, приступим
Что же, начнём. А начнём мы по порядку — напишем Hello, World, чтобы понять базовые принципы построения приложения с помощью wxPython. Вот он, пред вами , государь:
import wx app = wx.App() wnd = wx.Frame(None, wx.ID_ANY, "I'm the title") wnd.Show(True) app.MainLoop()
Сначала давайте запустим приложение и посмотрим, что у нас получилось. Сказано — сделано.
Разбор полётов
Хорошо, теперь пора разобраться в том, что делает данный код. Овсянку, сэр!
Тут всё более, чем очевидно. Тут мы импортируем пакет для работы с wxPython.
Здесь происходит создание экземпляра нашей программы, которая впоследствии и будет запущена.
wnd = wx.Frame(None, wx.ID_ANY, "I'm the title")
- Parent — наш первый параметр. В данный момент он указывает на то, что это главное окно нашей программы и оно не наследованно от какого-либо другого.
- Id — идентификатор, который представляет собой ничто иное, как порядковый номер окна. Здесь нам не обязательно проставлять номера вручную, достаточно лишь указать wx.ID_ANY, который сам обо всём позаботится.
- Title — без комментариев…
Это заголовок нашего окна.
Здесь мы указываем на то, что наше окно должно стать видимым.
И, наконец, запускаем нашу программу. Вот и всё…
Начинаем строить
Предполагается, что вы уже ознакомились с Classes Reference и знаете, какие элементы GUI доступны в wxPython. Я предлагаю нам взять и написать что-либо целостное и рабочее. Хорошо. Давайте с вами напишем миниатюрный текстовый редактор.
Добавляем поле для ввода текста
Как вы знаете, текстовое поле в wxPython представленно классом TextCtrl. По умолчанию, текстовое поле, которое мы создаём является однолинейным, т.е. запись текста будет производиться в одну строку.
Давайте исправим это и добавим атрибут style со значением TE_MULTILINE к объекту TextCtrl. Код нашего первого текстового редактора будет выглядеть так:
import wx class Window(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, title = title, size = (300,250)) self.control = wx.TextCtrl(self, style = wx.TE_MULTILINE) self.Show(True) app = wx.App() wnd = Window(None, "pyNote") app.MainLoop()
Давайте запустим нашу программу и убедимся, что всё работает.
Примечание: совсем забыл. Хотел добавить, что я предпологаю, что вы знакомы с ООП в Python, т.к. объяснять, что такое self или class Window(wx.Frame) я не собираюсь.
Официант, меню будьте добры
Как-то суховато выглядит наш с вами редактор, да? Конечно, в нём нету даже меню. Давайте исправим положением и создадим меню. В этом нет ничего сложного.
import wx class Window(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, title = title, size = (300,250)) self.control = wx.TextCtrl(self, style = wx.TE_MULTILINE) # создаём текстовое поле self.Show(True) menu = wx.Menu() # создаём экземпляр меню menu.Append(wx.ID_ABOUT,"About","Push the button to get an information about this application") # добавляем подпункты к меню menu.Append(wx.ID_EXIT,"Exit","Push the button to leave this application") # а как ещё? bar = wx.MenuBar() # создаём рабочую область для меню bar.Append(menu,"File") # добавляем пункт меню self.SetMenuBar(bar) # указываем, что это меню надо показать в нашей форме app = wx.App() wnd = Window(None, "pyNote") app.MainLoop()
А вот и наш редактор с меню:
Обработка событий
Но что это? Мы нажимаем «Exit», а программа не завершается. Что же, пора перейти к достаточно важному этапу — научить программу обрабатывать события. Добиться этого можно несколькими способами. Например, вот так:
def __init__(self, parent, title): self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
Данное выражение означает, что если мы кликнем пункт «About», то наша программа вызовет функцию OnAbout.
Хорошо, давайте объявим эту функцию. Выглядеть она будет так:
def OnAbout(self, e): dlg = wx.MessageDialog(self, "This is a mini editor keeping your text","About pyNote", wx.OK) # создаём всплывашку dlg.ShowModal() # показываем окошко
Вот и всё. Теперь, когда мы ткнём в «About», увидим вот такое сообщение:
Полный код приводить не стану, а скажу лишь, что…
Вы можете скачать исходный код.
Монолог? Нет, диалог!
Не будем забывать, что мы пишем какой-никакой текстовый редактор. Поэтому нам нужно организовать процесс открытия/закрытия файлов. На помощь приходит Чип и Дейл FileDialog. Для начала нам необходимо создать пункт «Open» в меню, по которму будет вызван диалог открытия файла (функция OnOpen).
Теперь нам нужно создать экземпляр FileDialog с некоторыми параметрами. Сейчас всё увидите:
import wx import os class Window(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, title = title, size = (300,250)) self.control = wx.TextCtrl(self, style = wx.TE_MULTILINE) self.Show(True) menu = wx.Menu() openItem = menu.Append(wx.ID_ANY, "Open", "Push the button to open the file") aboutItem = menu.Append(wx.ID_ABOUT,"About","Push the button to get an information about this application") exitItem = menu.Append(wx.ID_EXIT,"Exit","Push the button to leave this application") bar = wx.MenuBar() bar.Append(menu,"File") self.SetMenuBar(bar) self.Bind(wx.EVT_MENU, self.OnOpen, openItem) self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem) self.Bind(wx.EVT_MENU, self.OnExit, exitItem) def OnAbout(self, e): aboutDlg = wx.MessageDialog(self, "This is a mini editor keeping your text","About pyNote", wx.OK) aboutDlg.ShowModal() def OnOpen(self, e): self.dirname = " " openDlg = wx.FileDialog(self, "Choose a file to open", self.dirname, " ", "*.*", wx.OPEN) # создаём диалог if openDlg.ShowModal() == wx.ID_OK: # при выборе файла self.filename = openDlg.GetFilename() # ловим название файла self.dirname = openDlg.GetDirectory() # и папку, в которой он находится f = open(os.path.join(self.dirname,self.filename), "r") # открываем файл self.control.SetValue(f.read()) # отображаем в текстовом поле f.close() wnd.SetTitle(self.filename + " - pyNote") # меняем заголовок окна app = wx.App() wnd = Window(None, "pyNote") app.MainLoop()
Вот и всё. Давайте запустим наше творение. И, внимание… Барабанная дробь… Нажимаем на «Open» и видим…
Заключение
Вот и всё на данный момент. Сегодня мы познакомились с великолепным тулкитом под названием wxPython, который позволяет писать великолепные приложения с минимальными затратами сил.