我如何实际进入GUI编程?

时间:2009-12-07 19:42:50

标签: java user-interface

我是一名本科生。几年前我在学校接触过基本编程。到目前为止,我已经了解了Core Java,Core Python和基本的C和C ++。

每次我开始使用一些GUI编程,以便我可以从我的一个项目开始,我会被要完成的数量,要学习的API,MVC架构以及程序员所讨论的一切所困扰,事件处理等等。

研究了awt并挥了一会儿。试过Qt和Gtk的手,找不到太多的文档。试图理解pygame。我知道核心语言,最终到了同一个地方。

我的zenwalk Linux上的Tkinter已经破了,所以在Tkinter解释说我拥有一本关于python的书之后就永远无法启动它。

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

现在想认真重新开始。我想选择python。我该如何研究GUI编程?

我需要一些互联网资源和方向,以便我不会在同一个地方结束!

11 个答案:

答案 0 :(得分:5)

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

对于那些了解Python的人来说,这可能是一个非常好的起点,并希望从一些基本的GUI应用程序开始。 GTK有时很复杂,但有了PyGTK,你可以学习很多开源示例应用程序,从简单到复杂。

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

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

答案 1 :(得分:2)

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

我建议您安装 Pygame Python ,然后浏览 tutorials 。选择一个简单的游戏或图形项目并编程吧!

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我知道你的感受 - 我在CS学位期间学到了很多计算机编程,但很少有关于GUI的知识。我最终在一个项目中教自己Cocoa / Objective-C。对于GUI来说,Cocoa是精彩的,但往往是一种具有陡峭学习曲线的皇室痛苦。如果您对C编程没有任何经验,请不要打扰。

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

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

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

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

第二步:找出你想要的东西。您是否特别对桌面应用程序感兴趣?游戏?网络应用程序?

如果您想要做的主要是能够开发人们实际使用的东西,另一种选择是学习Web开发框架。框架使您的工作变得简单。我个人喜欢Django,如果你知道一点点Python和一些HTML以及一些关于MVC的东西,你可以快速拿起它。 (只是不要混淆,因为Django称视图实际上是一个控制器。)

如果您想要做的是游戏或图形/动画内容,请查看pygame。我把它用于一个课堂项目 - 基本上是在几周内教给我自己 - 而且效果很好。

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

我听说过关于wxPython的好东西 - 我几乎最终使用它而不是Cocoa,因为wx的东西可以用几种编程语言来实现,而且它们都是跨平台的。

祝你好运!坚强点!我知道这真的令人生畏,因为我一直在你的鞋子里。你可以通过一些工作,练习和动力去做。

答案 4 :(得分:2)

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

现在,小心!

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

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

答案 5 :(得分:1)

“图形”是什么意思?你的意思是游戏图形,还是仅仅意味着用户界面代码(表单,网页,那种东西)?在游戏图形的情况下,可以制作简单的东西是有限的,但是http://www.gamedev.net例如在2d和3d引擎上有大量的介绍性文章。对于应用程序行中的更多内容,您可能只需下载Visual Studio或Eclipse,并花些时间查看由其WYSIWYG编辑器自动生成的代码。

答案 6 :(得分:1)

一般用于GUI工作

少即是多

GUI工作(即使在高效的框架中)与使用牙刷绘制艾菲尔铁塔一样有趣和高效。寻求最小的设计。

避免瘟疫状态

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

<强> 的wxPython

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

教程

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

这是我找到的最好的一个。

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

<强>事件

事件有点像异常,它们用于使事物互动。

在一个vanilla 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并不是太热,但也可以调用对话框,或者做任何你想要的事情。

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

应用,相框,Windows,面板和分级器

一切都有父母。如果引发了一个事件,并且孩子没有跳过它(使用event.Skip()),那么父母也必须处理该事件。这类似于提升到更高级别功能的例外。

wx.App与主要功能类似。

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有一个监听器 - 订阅者框架,这是我刚刚勾勒出的模型的更好版本(它使用弱引用,因此删除的侦听器不会挂起,等等),但这应该可以帮助你获得想法。

答案 7 :(得分:0)

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

尽管如此,听起来好像你在坚持使用一个足够长的框架来解决问题。我可以建议从一个小项目开始,比如Pong或Breakout,并且只学习你需要的东西吗?一旦你完成了一件事,你将对图书馆有一种感觉,并继续经过那里更容易。

答案 8 :(得分:0)

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

在开发基于GUI的应用程序中可以帮助您快速前进的内容不是语言,而是您使用的IDE。一个好的IDE可以为你做一些不太有趣的事情,让你专注于全局。

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

答案 9 :(得分:0)

您可以学习的最好的Python GUI之一是IDLE的来源。它总是带有Python。

答案 10 :(得分:0)

对于Java,您还可以查看SWT

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

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