【问题标题】:How do I actually get somewhere in GUI programming?我如何真正在 GUI 编程中有所作为?
【发布时间】:2009-12-10 03:43:47
【问题描述】:

我是一名本科生。几年前,我在学校接触了基本的编程。到现在为止,我对 Core Java、Core Python 和基本的 C 和 C++ 有了一定的了解。

每次我从一些 GUI 编程开始,以便从我的项目开始时,我都会对要完成的大量工作、要学习的 API、MVC 架构以及程序员谈论的所有内容感到困惑,事件处理等。

学习了一段时间的awt和swings。尝试使用 Qt 和 Gtk,找不到太多文档。试图理解 pygame。我最终在同一个地方,了解核心语言。

我的 zenwalk Linux 上的 Tkinter 坏了所以无法启动它,尽管我有一本关于 Python 的书,里面有 Tkinter 的解释。

但我最终还是在同一个地方,只是对语言有基本的了解。

想重新开始,现在认真。我想选择python。我应该如何学习 GUI 编程?

我需要一些互联网资源和方向,这样我就不会落入同一个地方!

【问题讨论】:

  • 用 Python 进行图形编程?认真的吗?
  • @David Lively - 从那里开始有什么问题?他显然是图形初学者,似乎对编程只有基本的了解(如果我错了,请见谅)。
  • 图形编程是指图形用户界面编程吗?还是您指的是计算机图形学,例如电子游戏和动画电影?
  • 图形编程是指基本的应用程序开发。图形用户界面。不是 3D API
  • re "Qt <...> 找不到太多文档":这是在开玩笑吗? (doc.trolltech.com/4.6/index.html)。 Qt 的文档是我见过的最好的 api 文档之一。他们在记录一个 大的框架方面做得很好。

标签: java user-interface


【解决方案1】:

既然听起来你想要 Python GUI 编程,我可以建议PyGTK吗?

对于了解 Python 并希望在一些基本的 GUI 应用程序上从小处着手的人来说,这可能是一个很好的起点。 GTK 有时可能很复杂,但使用 PyGTK,您可以学习大量开源示例应用程序,从简单到复杂。

编辑:本教程from LinuxJournal 似乎很有帮助。

编辑 2:这里是 the tutorial from PyGTK's siteanother tutorial I randomly found from Google(看起来整个博客对于您想要做的事情非常有用,实际上)。最后,this page 底部的 sn-p 可能会有所帮助,由 Ubuntu 论坛提供。

【讨论】:

  • 谢谢雷诺兹。你的帖子很有帮助。 :)
  • 我能有更多的 pygtk 资源和电子书吗?
  • 尝试为您添加更多,如果有帮助请告诉我。
【解决方案2】:

如果你更倾向于游戏......

我建议你安装PygamePython,并通过他们的tutorials。选择一个简单的游戏或图形项目并对其进行编程!

【讨论】:

    【解决方案3】:

    对于 Python GUI,我喜欢 wxPython (www.wxpython.org)。使用简单的控件和布局很容易上手。它也是跨平台的。那里有很多教程。直接搜索 wxPython 教程即可。

    【讨论】:

    • 我自己没用过,但是经常听说wxPython的好东西。如果您发现 PyGTK 令人沮丧,这可能是满足您需求的一个很好的替代解决方案,尽管我无法为您提供任何第一手经验。
    • wxPython 很棒!我已经有一段时间没有使用它了,但是文档曾经相当不完整。它曾经迫使你回到 wxWindows C++ API 文档,如果你不懂 C++,这是一个问题。
    【解决方案4】:

    我知道你的感受——我在 CS 学位期间学到了很多计算机编程,但对 GUI 知之甚少。我最终为一个项目自学了 Cocoa/Objective-C。 Cocoa 对于 GUI 的东西来说是美妙,但通常是具有陡峭学习曲线的皇家痛苦。如果您没有任何 C 编程经验,请不要打扰。

    第一步:熟悉 MVC(模型/视图/控制器)设计约定,因为几乎每个 GUI 框架都会引用它。谷歌一下——有很多关于它的资源。我快速、简单的定义是:

    模型级别定义应用程序的数据或逻辑模型。对于 Web 应用程序,这将是数据库。对于一个游戏来说,它可以是存储数据和游戏逻辑/规则。

    视图级别是用户看到并与之交互的内容(GUI)。

    控制器级别是连接两者的逻辑。例如,控制器知道当您单击视图级别中的“开始游戏”按钮时,它会对模型执行一些操作(例如,设置棋盘和玩家。)

    第二步:弄清楚你想要什么。您是否对桌面应用程序特别感兴趣?游戏?网络应用?

    如果您主要想做的是能够开发人们实际使用的东西,那么另一种选择是学习 Web 开发框架。这些框架使您的工作变得轻松。我个人喜欢 Django,如果你了解一点 Python 和一点 HTML 以及一点 MVC 知识,你就可以快速上手。 (只是不要混淆,因为 Django 所谓的视图实际上是一个控制器。)

    如果您想做的是游戏或图形/动画,请查看 pygame。我将它用于一个课堂项目——基本上是在几周内自学的——效果很好。

    我会说尽可能远离 Java Swing/awt/etc。

    我听说过关于 wxPython 的好消息——我几乎最终用它代替了 Cocoa,因为 wx 的东西有多种编程语言可用,而且都是跨平台的。

    祝你好运!坚强点!我知道这真的很吓人,因为我一直站在你的立场上。您可以通过一些工作、练习和动力来做到这一点。

    【讨论】:

    • 顺便说一句,为什么要远离 Java Swing/awt/etc ??
    • 根据我的经验,用 Java 开发 GUI 应用程序是一件非常痛苦的事情。制作一个真正好看的界面很难,很难让事情做你想做的事,而且你必须为基本的 GUI 内容编写大量代码。 (就像每个事件的事件监听器等)
    • Plus AWT 现在已经过时了。
    【解决方案5】:

    很多人都推荐了 wxPython,我赞同他们的热情——它是一个很棒的框架;它还包括一个严肃的演示(带有代码和实时应用程序),这对学习非常有价值。

    现在,当心!

    将目的与手段混淆是非常简单的。编程 GUI 可能非常有吸引力,但效率不高。在我早期的日子里,我花了几天时间试图获得一个简单的绘图应用程序(重新发明轮子);用于求解二次方程的简单 GUI;一个简单的 GUI,用于通过单击地图上的某些位置等来调用数据库查询。在这段时间里,我从未真正深入研究过算法或更通用和高效的计算机科学和计算机工程主题。回想起来,我应该有。诚然,我确实学到了很多东西,而且我并不完全后悔,但我的建议是:首先担心你的算法,然后再担心你的界面。这可能不适用于所有领域(我是 NASA 的工程师)。现在,我使用没有任何 GUI 的数字运算应用程序。我认为他们不需要它们!

    无论如何,我只是想与 GUI 编程分享我的两分钱 - 玩得开心但不要过度。

    【讨论】:

    • Web 界面最好的一点是它们的最小设计(由于 Web 编程的限制)。如果拉里和佩奇在编写谷歌界面时不仅仅具备基本的网页设计技能,那么情况可能会比实际情况糟糕得多。少即是多。它也更便宜。
    【解决方案6】:

    您所说的“图形”是什么意思?您是指游戏图形,还是仅仅指用户界面代码(表单、网页等)?就游戏图形而言,制作简单的东西是有限度的,但例如http://www.gamedev.net 有大量关于 2d 和 3d 引擎的介绍性文章。对于应用程序线的更多内容,您可能只需下载 Visual Studio 或 Eclipse 并花一些时间查看由其所见即所得编辑器自动生成的代码。

    【讨论】:

      【解决方案7】:

      对于一般的 GUI 工作

      少即是多

      GUI 工作(即使在生产性框架中)与用牙刷绘制埃菲尔铁塔一样有趣且富有成效。寻求最小的设计。

      避免像瘟疫一样的状态

      您将状态放在 GUI 中还是模型中?如果你把它放在 GUI 中,你会用冗余和不一致的代码路径搞砸自己。如果将其放入模型中,则当您的 GUI 无法从模型更新时,您将面临一个过于复杂的系统失去同步的风险。两个都很烂。

      wxPython

      如果你想学习 wxPython,以下是我注意到的几个陷阱:

      教程

      使用本教程 - http://wiki.wxpython.org/AnotherTutorial

      这是我找到的最好的。

      但请记住切换行号,以便于粘贴。

      活动

      事件有点像异常,它们被用来使事物交互。

      在一个普通的 Python 程序中,你可以编写如下代码:

       def doit(i): 
            print 'Doing i = ',i
      
      for i in range(10):
          doit()
      
      print 'Results = ',result
      

      在 GUI 中,您可以执行以下操作:

       def doit(event): 
           print 'An event',event,'just happened!'
           event.Skip()
      
      import wx
      app = wx.App() 
      frame = wx.Frame(None, -1, 'The title goes here') 
      frame.Bind(wx.EVT_KEY_DOWN, doit)
      frame.Show()
      app.MainLoop()
      

      每次用户按下一个键时,都会引发一个事件。由于frame 绑定到事件(frame.Bind(wx.EVT_KEY_DOWN, doit)),函数doit 将作为参数调用。

      在 gui 中打印到 stderr 并不太热,但是 doit 也可以调用一个对话框,或者做任何你想做的事情。

      此外,您可以使用计时器生成自己的事件。

      应用程序、框架、窗口、面板和 Sizer

      万物皆有父。如果引发了一个事件,并且子级没有跳过它(使用event.Skip()),那么父级也必须处理该事件。这类似于引发更高级别函数的异常。

      wx.App 类似于 Main 函数。

      wx.Window 并没有真正使用。 Stuff 继承自它,它具有所有大小和布局的方法,但您不需要知道。

      wx.Frame 是一个浮动框架,类似于 Firefox 中的主窗口。您将在基本应用程序中拥有主要的一帧。如果你想编辑多个文件,那么你可能有更多。 wx.Frame 通常没有父级。

      wx.Panel 是父窗口的一部分。一个框架内可以有多个面板。一个面板可以有一个wx.Frame 作为父面板,或者它可能是另一个面板的子面板。

      wx.Sizers 用于在框架(或其他面板)内自动布局面板。

      代码:

      def doit1(event):
          print 'event 1 happened'
      
      def doit2(event): 
           print 'event 2 happened'
      
      import wx
      app = wx.App()
      frame = wx.Frame(None, -1, 'The title goes here') 
      
      panel_1 = wx.Panel(frame,-1,style=wx.SIMPLE_BORDER) 
      panel_2 = wx.Panel(frame,-1,style=wx.SIMPLE_BORDER)
      
      panel_1.Bind(wx.EVT_KEY_DOWN, doit1)
      panel_2.Bind(wx.EVT_KEY_DOWN, doit2)
      
      panel_1.SetBackgroundColour(wx.BLACK)
      panel_2.SetBackgroundColour(wx.RED)
      
      box = wx.BoxSizer(wx.HORIZONTAL)
      box.Add(panel_1,1,wx.EXPAND)
      box.Add(panel_2,1,wx.EXPAND)
      
      frame.SetSizer(box)
      
      frame.Show()
      
      app.MainLoop()
      

      我真的很糟糕,没有使用 OOP 实践。请记住,即使您在大多数情况下都讨厌 OO,但 GUI 编程才是 OOP 真正闪耀的地方。

      MCV

      我没有获得 MCV。我不认为你需要一个 MCV。我认为 MW(模型小部件)框架很好。

      例如 - 编辑同一段文本的 2 个框架:

      class Model(object):
          def __init__(self):
              self.value = 'Enter a value'
              self.listeners = []
      
          def Add_listener(self,listener):
              self.listeners.append(listener)
      
          def Set(self,new_value):
              self.value = new_value
              for listener in self.listeners:
                  listener.Update(self.value)
      
      
      import wx
      app = wx.App() 
      
      class CVFrame(wx.Frame):
          def __init__(self, parent, id, title, model):
              wx.Frame.__init__(self, parent, id, title, size = (100,100))
              self.button = wx.Button(self, -1, 'Set model value')
              self.textctrl = wx.TextCtrl(self, -1,model.value)
              self.button.Bind(wx.EVT_BUTTON,self.OnSet)
      
              self.model = model
              model.Add_listener(self)
      
              sizer = wx.BoxSizer(wx.VERTICAL)
              sizer.Add(self.button,0,wx.EXPAND)
              sizer.Add(self.textctrl,1,wx.EXPAND)
      
              self.SetSize((300,100))
              self.SetSizer(sizer)
              self.Center()
              self.Show()
      
          def OnSet(self,event):
              self.model.Set(self.textctrl.GetValue())
      
          def Update(self,value):
              self.textctrl.SetValue(value)
      
      model = Model()
      frame1 = CVFrame(None, -1, 'Frame 1',model)
      frame2 = CVFrame(None, -1, 'Frame 2',model) 
      app.MainLoop()
      

      wxPython 有一个 listener-subscriber 框架,它是我刚刚勾勒出的模型的一个更好的版本(它使用弱引用,所以被删除的侦听器不会闲逛,等等),但这应该可以帮助你获得想法。

      【讨论】:

      • 不应该是 MVC,而不是 MCV?
      【解决方案8】:

      如果你已经使用过 pygame、tk、Qt 和 GTK,那么我唯一能想到的就是 pyglet,我承认我没有尝试过,但我读过关于它。

      不过,最重要的是,听起来好像你很难坚持使用足够长的时间来真正理解它。我可以建议从一个小项目开始,比如 Pong 或 Breakout,并且只学习你需要做的事情吗?一旦你完成了一件事情,你就会对图书馆有一种感觉,然后继续往前走就容易多了。

      【讨论】:

        【解决方案9】:

        无论您选择哪种语言,您都必须处理涉及 GUI 编程的许多细节。这是由于通常用于 GUI 的基于窗口的环境的性质。

        帮助您快速开发基于 GUI 的应用程序的是更少的语言,更多的是您使用的 IDE。一个好的 IDE 可以为您做一些不那么有趣的事情,让您专注于全局。

        在 VS 2008 中使用 C#,它的全部内容都是从列表框中选择元素和方法。它很容易上手并有一个工作项目。
        然后,您可以尝试自定义您的应用程序,以更好地了解幕后发生的事情

        【讨论】:

          【解决方案10】:

          您可以学习的最棒的 Python GUI 之一是 IDLE 的源代码。它总是随 Python 一起提供的。

          【讨论】:

            【解决方案11】:

            对于 Java,您还可以查看 SWT

            虽然我从未使用过 AWT 或 Swing,但我了解到 SWT 是三者中最容易学习的。

            Here 是三者之间的一个不错的比较。

            【讨论】:

              猜你喜欢
              • 2013-06-04
              • 1970-01-01
              • 2013-10-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-22
              相关资源
              最近更新 更多