GUI库主要有三类:tkinter,wxPython和PyQt5,下面主要是针对wxPython的使用说明。

下面的操作均在win10 + pycharm上进行

  1. wxPython的安装:

    pip install wxPython

    同时还安装了两个依赖包:six和pillow

  2. 简单使用:

    变量app就是我们的程序。

    其次一定要注意大小写,尤其是Show的S

    import wx
    app = wx.App()
    frame = wx.Frame(None, title = "Hello,world!")
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  3. 进一步,我们可以添加一个按钮:

    通过定义一个MyFrame类来实现,这个类继承自wx.Frame类。

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    self.button = wx.Button(self, label = "hello") app = wx.App()
    frame = MyFrame(None, title = "Hello,world!")
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  4. 但有一个问题,这个按钮太大了,布满了整个界面,所以我们可以进一步设置按钮的大小和布局:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    self.btn1 = wx.Button(self, label="hello1", pos=(10, 50), size=(100, 50))
    self.btn2 = wx.Button(self, label="hello2", pos=(120, 50), size=(100, 50)) app = wx.App()
    frame = MyFrame(None, title="Hello,world!")
    frame.Show()
    app.MainLoop()

    其中,pos是位置参数,第一个表示与左边界的为距离,第二个表示与上边界的距离;size是按钮的大小参数,第一个表示宽度,第二个表示高度。

    有一点需要注意,这个按钮是绝对布局下的按钮,也就是说无论你把窗口变多大多小,按钮都不会随着窗口的大小变化

  5. 我们虽然有按钮了,此时还需要加入焦点:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    panel = wx.Panel(self)
    self.btn1 = wx.Button(panel, label="hello1", pos=(10, 50), size=(100, 50))
    self.btn2 = wx.Button(panel, label="hello2", pos=(120, 50), size=(100, 50)) app = wx.App()
    frame = MyFrame(None, title="Hello,world!")
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:



    我们通过加入了wx.Panel从而可以使用鼠标点击对应按钮,或者使用Tab键来移动到下一个按钮。

  6. 现在点击也可以了,但是没有反应还不行,所以我们将按钮和对应的事件进行绑定,也就是响应按钮事件:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    panel = wx.Panel(self)
    self.btn1 = wx.Button(panel, label="hello1", pos=(10, 50), size=(100, 50))
    self.btn2 = wx.Button(panel, label="hello2", pos=(120, 50), size=(100, 50))
    self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
    self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
    def OnButton1(self, event):
    print("Hello,world!")
    def OnButton2(self, event):
    print("Hello,world!Hello,world!") app = wx.App()
    frame = MyFrame(None, title="Hello,world!")
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  7. 下面介绍一些控件的使用:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    panel = wx.Panel(self) self.static_text = wx.StaticText(panel, label="静态文本", pos=(10, 10)) self.text_1 = wx.TextCtrl(panel, value="文本框", pos=(10, 40))
    self.text_2 = wx.TextCtrl(panel, value="密码框", style=wx.TE_PASSWORD, pos=(10, 70))
    self.text_3 = wx.TextCtrl(panel, value="只读文本框", style=wx.TE_READONLY, pos=(10, 100))
    self.text_4 = wx.TextCtrl(panel, value="多行\n文本框", style=wx.TE_MULTILINE, pos=(10, 130)) self.btn1 = wx.Button(panel, label="修改窗口标题", pos=(200, 10))
    self.btn2 = wx.Button(panel, label="修改静态文本内容", pos=(200, 40))
    self.btn3 = wx.Button(panel, label="修改文本框内容", pos=(200, 70))
    self.btn4 = wx.Button(panel, label="修改只读文本框内容", pos=(200, 100)) self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
    self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
    self.Bind(wx.EVT_BUTTON, self.OnButton3, self.btn3)
    self.Bind(wx.EVT_BUTTON, self.OnText1, self.btn4) def OnButton1(self, event):
    self.Title += 'Hello'
    def OnButton2(self, event):
    self.static_text.Label += 'Hi'
    def OnButton3(self, event):
    self.text_1.Value = 'Good'
    self.text_2.Value = 'GOOD'
    self.text_3.Value = 'Good\nbetter\nbest'
    self.text_4.Value = 'GOOD\nBetter\nBest'
    def OnText1(self, event):
    self.text_3.Value = self.text_1.Value app = wx.App()
    frame = MyFrame(None, title="Multi_Text", size=(500, 300))
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  8. 接下来我们看一下加入图片控件的使用:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    self.bitmap = wx.StaticBitmap(self, pos=(10, 10))
    self.btn1 = wx.Button(self, label="001", pos=(300, 10))
    self.btn2 = wx.Button(self, label='002', pos=(300, 40))
    self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
    self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2) def OnButton1(self, event):
    self.bitmap.Bitmap = wx.Bitmap('002.jpeg')
    def OnButton2(self, event):
    self.bitmap.Bitmap = wx.Bitmap('001.jpg') app = wx.App()
    frame = MyFrame(None, title="Images", size=(500, 290))
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  9. 接下来我们解决相对布局的问题,首先可以使用BoxSizer来使缩小窗口时不会遮挡按钮:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    sizer = wx.BoxSizer(wx.HORIZONTAL)
    self.bitmap = wx.StaticBitmap(self, bitmap=wx.Bitmap('001.jpg'))
    self.btn1 = wx.Button(self, label="001")
    self.btn2 = wx.Button(self, label='002')
    self.Bind(wx.EVT_BUTTON, self.OnButton1, self.btn1)
    self.Bind(wx.EVT_BUTTON, self.OnButton2, self.btn2)
    sizer.Add(self.btn1)
    sizer.Add(self.btn2)
    sizer.Add(self.bitmap)
    self.SetSizerAndFit(sizer) def OnButton1(self, event):
    self.bitmap.Bitmap = wx.Bitmap('002.jpeg')
    def OnButton2(self, event):
    self.bitmap.Bitmap = wx.Bitmap('001.jpg') app = wx.App()
    frame = MyFrame(None, title="Images", size=(500, 290))
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  10. 当拉动窗口时,按钮将一直保持相同比例跟随其变化:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    self.btn1 = wx.Button(self, label="button1")
    self.btn2 = wx.Button(self, label='button2')
    sizer = wx.BoxSizer(wx.VERTICAL)
    sizer.Add(self.btn1, 1)
    sizer.Add(self.btn2, 3)
    self.SetSizerAndFit(sizer) app = wx.App()
    frame = MyFrame(None, title="vertical")
    frame.Show()
    app.MainLoop()

    运行后的界面如下所示:

  11. 当然,也可以添加位置信息:

    sizer.Add(self.btn1, 1, wx.ALIGN_LEFT)
    sizer.Add(self.btn3, 2, wx.TEXT_ALIGNMENT_LEFT)
    sizer.Add(self.btn2, 3, wx.EXPAND)
  12. 也可以加边框距离:

     sizer.Add(self.btn1, 1, wx.ALIGN_LEFT|wx.ALL, 10)
    sizer.Add(self.btn3, 2, wx.TEXT_ALIGNMENT_LEFT|wx.LEFT|wx.RIGHT, 300)
    sizer.Add(self.btn2, 3, wx.EXPAND)
  13. 也可以Add一个块来进行占位:

    sizer.Add((50, 60))
  14. 还可以设置比例:

    sizer.Add(self.btn1, 1, wx.ALL, 30)
    sizer.Add(self.btn3, 1, wx.ALL, 30)
    sizer.Add(self.btn2, 1, wx.ALL, 30)
    sizer.Add((50, 60), 3)

    运行后的界面如下所示:

  15. 最后来看一个嵌套布局:

    import wx
    
    class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
    wx.Frame.__init__(self, *args, **kw)
    self.btn1 = wx.Button(self, label="button1")
    self.btn2 = wx.Button(self, label='button2')
    self.btn3 = wx.Button(self, label='button3')
    self.btn4 = wx.Button(self, label="button4")
    self.btn5 = wx.Button(self, label="button5")
    hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
    hsizer1.Add(self.btn1, 0, wx.ALL, 5)
    hsizer1.Add(self.btn2, 0, wx.ALL, 5)
    hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
    hsizer2.Add(self.btn3, 1, wx.ALL, 5)
    hsizer2.Add(self.btn4, 1, wx.ALL, 5)
    vsizer1 = wx.BoxSizer(wx.VERTICAL)
    vsizer1.Add(hsizer1, 0, wx.ALIGN_RIGHT)
    vsizer1.Add(hsizer2, 0, wx.EXPAND)
    vsizer1.Add(self.btn5, 1, wx.EXPAND)
    self.SetSizerAndFit(vsizer1) app = wx.App()
    frame = MyFrame(None, title="嵌套BoxSizer")
    frame.Show()
    app.MainLoop()

    然后来看运行效果:

如何使用python图形化界面wxPython的更多相关文章

  1. PySide——Python图形化界面

    PySide——Python图形化界面 PySide——Python图形化界面入门教程(四) PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your ...

  2. PySide——Python图形化界面入门教程(四)

    PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral ...

  3. PySide——Python图形化界面入门教程(六)

    PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...

  4. PySide——Python图形化界面入门教程(五)

    PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...

  5. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  6. PySide——Python图形化界面入门教程(二)

    PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...

  7. PySide——Python图形化界面入门教程(一)

    PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-w ...

  8. python+pycharm+PyQt5 图形化界面安装教程

    python图形化界面安装教程 配置环境变量 主目录 pip所在目录,及script目录 更新pip(可选) python -m pip install --upgrade pip ps:更新出错一般 ...

  9. Git各大平台(win/Linux/Mac)图形化界面客户端大汇总

    摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~  一.TortoiseGit - The coolest Interface to Git V ...

随机推荐

  1. 谁来破解公交WiFi的尴尬困局?

      在咖啡馆.饭店坐定,菜单可以待会再看,远远看见服务员迎上来,赶紧先问一句:"这里有无线网吗,密码是多少",和笔者一样养成类似习惯的人越来越多.所以,当公交WiFi"大 ...

  2. GYOJ_1812_股票(stock)

    题目描述 2130年,股神巴菲特投胎了!他投胎到你身上! 你作为股神转世,能力比原股神还要强,你可以预测到今后n天的股价.假设刚开始你的手上有1元钱,你想知道n天后你最多可以赚到多少钱.作为股神转世, ...

  3. Eclipse快速入门:远程调试Java应用

    Eclipse快速入门:远程调试Java应用 2012年03月27日00:00 it168网站原创 作者:皮丽华 编辑:皮丽华 我要评论(0) 标签: Eclipse , Java , Java框架, ...

  4. 我是一个Bug, 终极大Bug

    我是一个Bug ,在这个系统中潜伏很久了,历经多轮测试的严酷考验而屹立不倒,如果Bug界按难度分类的话,我绝对属于地狱模式. 现在,我就等待一个倒霉蛋来触发, 可是他老是不来. 其实不能叫倒霉蛋 , ...

  5. android中SeekBar拖动进度条的使用及事件监听

    下面和大家分享一下android中SeekBar拖动进度条的使用,以及事件监听.拖动进度条的事件监听需要实现SeekBar.OnSeekBarChangeListener接口,调用SeekBar的se ...

  6. linux下查找文件及查找包含指定内容的文件常用命令

    whereis <程序名称> 查找软件的安装路径-b 只查找二进制文件-m 只查找帮助文件-s 只查找源代码-u 排除指定类型文件-f 只显示文件名-B <目录> 在指定目录下 ...

  7. 为何滴滴会走Uber之路,研发无人驾驶?

    近日,滴滴出行宣布完成新一轮超过55亿美元融资,以支持其全球化战略的推进和前沿技术领域的投资.其中,无人驾驶汽车将是这笔资金重要的投资方向.此前,滴滴在全球范围内的追赶对象Uber不断在无人汽车领域发 ...

  8. Python第一周基本语句学习整理

    目录 Python第一周基本语句学习整理 一.字符串切割 二.体重单位转换 三.计算器的实现 四.猜年龄游戏 Python第一周基本语句学习整理 一.字符串切割 代码实现: s = 'luowenxi ...

  9. 基于netty的群聊

    基于netty的群聊 学了一段时间的netty知识,现在通过这个基于console的程序来对netty的相关接口做个简单的应用. 准备 依赖 <dependency> <groupI ...

  10. electron+vue制作桌面应用--自定义标题栏

    electron会默认显示边框和标题栏,如下图 我们来看一下如何自定义一个更加有(gao)意(da)思(shang)的标题栏,例如网易云音乐这种 首先我们要把默认的标题栏删掉,找到主进程中创建窗体部分 ...