胡锦涛

胡锦涛的博客

他的个人主页  他的博客

直接扔代码吧(1)

胡锦涛  2009年08月14日 星期五 06:29 | 1785次浏览 | 4条评论

没事写的小程序 直接扔代码吧
学习python中

拼图游戏 还有很多Bug ORZ!见笑了


#!/usr/bin/env python

import random
import sys
import pygtk; pygtk.require("2.0")
import gtk

pixmap = None
press_x = 0
press_y = 0
split = 5
size = split * split

def combo_changed(widget):
    global size,split,NumList
    i = widget.get_active()
    if i == 0:
        split = 5
    elif i == 1:
        split = 6
    else :
        split = 7

    size = split *split
    init_list()
    luan(NumList)
    draw()
    return True

def destroy(*arg):
    window.hide()
    gtk.main_quit()

def check(list):
    for i in range(0,len(list)):
        if i <> list[i]:
            return False
    return True

def luan_clicked(*arg):
    luan(NumList)
    draw()
    return True

def button_press_event(widget, event):
    global press_x,press_y
    press_x = event.x
    press_y = event.y
    return True

def button_release_event(widget, event):
    global pixbuf,press_x,press_y
    win = drawing_area.window
    w = pixbuf.get_width()
    h = pixbuf.get_height()
    w1 = int(w / split)
    h1 = int(h / split)
    if int(event.x / w1) != int(press_x / w1) or int(event.y / h1) != int(press_y / h1):
        src_x = int(press_x / w1) * w1
        src_y = int(press_y / h1) * h1
        src_id = int(press_x / w1)  + int(press_y / h1) * split
        src_pos = NumList[src_id]
        src_image_x = (src_pos % split) * w1
        src_image_y = int(src_pos / split) * h1

        desc_x = int(event.x / w1) * w1
        desc_y = int(event.y / h1) * h1
        desc_id = int(event.x / w1) + int(event.y / h1) * split
        desc_pos = NumList[desc_id]
        desc_image_x = (desc_pos % split) * w1
        desc_image_y = int(desc_pos / split) * h1

        temp = NumList[src_id]
        NumList[src_id] = NumList[desc_id]
        NumList[desc_id] = temp
        pixmap.draw_pixbuf(drawing_area.get_style().white_gc,pixbuf,src_image_x,src_image_y,desc_x,desc_y,w1,h1,0,0,0)
        pixmap.draw_pixbuf(drawing_area.get_style().white_gc,pixbuf,desc_image_x,desc_image_y,src_x,src_y,w1,h1,0,0,0)
        r1 = gtk.gdk.Rectangle()
        r1.x = 0
        r1.y = 0
        r1.width  = w
        r1.height = h
        win.invalidate_rect(r1,True)
        if check(NumList):
            dlg = gtk.MessageDialog(window,gtk.DIALOG_DESTROY_WITH_PARENT,
                                    gtk.MESSAGE_INFO,
                                    gtk.BUTTONS_OK,
                                    "Your are win!")

            dlg.run()
            dlg.destroy()

    return True

def new(*arg):
    global pixbuf
    dlg = gtk.FileChooserDialog("Open File",
                                window,
                                buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
                                         gtk.STOCK_CANCEL,
                                         gtk.RESPONSE_CANCEL))
    resp = dlg.run()
    dlg.hide()
    if resp == gtk.RESPONSE_OK:
        fname = dlg.get_filename()
        pixbuf = gtk.gdk.pixbuf_new_from_file(fname)
        luan(NumList)
        draw()
    return True

def draw():
    global pixmap,pixbuf,NumList
    win = drawing_area.window
    width, height = win.get_size()
    pixmap = gtk.gdk.Pixmap(win, width, height)
    #pixmap.draw_rectangle(drawing_area.get_style().white_gc, True, 0, 0, width, height)
    for i in range(0,size):
        w = pixbuf.get_width()
        h = pixbuf.get_height()
        w1 = int(w / split)
        h1 = int(h / split)
        x = (NumList[i] % split)*w1
        y = int(NumList[i] / split)*h1
        x1 = (i % split)*w1
        y1 = int(i / split)*h1
        pixmap.draw_pixbuf(drawing_area.get_style().white_gc,pixbuf,x,y,x1,y1,w1,h1,0,0,0)
    r1 = gtk.gdk.Rectangle()
    r1.x = 0
    r1.y = 0
    r1.width  = width
    r1.height = height
    win.invalidate_rect(r1,True)

def expose_event(widget, event):
    if pixmap is not None:
        x, y, width, height = event.area
        gc = widget.get_style().fg_gc[gtk.STATE_NORMAL]
        widget.window.draw_drawable(gc, pixmap, x, y, x, y, width, height)
    return False

def luan(list):
    for i in range(0, len(list)):
        rand_pos = random.randint(0, len(list)-1)
        temp = list[rand_pos]
        list[rand_pos] = list[i]
        list[i] = temp

def init_list():
    global NumList,size
    NumList = []
    for i in range(0,size):
        NumList.append(i)

NumList = []
init_list()
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.maximize()
window.connect("destroy", destroy)
drawing_area = gtk.DrawingArea()

vbox = gtk.VBox()
button = gtk.Button("new")
button_luan = gtk.Button("luan")
hbox = gtk.HBox()
hbox.pack_start(button,False,False,10)
hbox.pack_start(button_luan,False,False,10)
hbox.pack_start(gtk.Label(" level:"),False,False,0)
combo = gtk.combo_box_new_text()
combo.append_text("Easy")
combo.append_text("Difficult")
combo.append_text("Hard")
combo.set_active(0)
combo.connect("changed",combo_changed)

hbox.pack_start(combo,False,False,10)

vbox.pack_start(hbox,False,False,0)
vbox.add(drawing_area)

button.connect("clicked", new)
button_luan.connect("clicked", luan_clicked)

#drawing_area.connect("configure_event", configure_event)
drawing_area.connect("expose_event", expose_event)
drawing_area.connect("button_press_event", button_press_event)
drawing_area.connect("button_release_event", button_release_event)
drawing_area.set_events(gtk.gdk.EXPOSURE_MASK |
                        gtk.gdk.LEAVE_NOTIFY_MASK |
                        gtk.gdk.BUTTON_PRESS_MASK |
                        gtk.gdk.BUTTON_RELEASE_MASK |
                        gtk.gdk.POINTER_MOTION_MASK |
                        gtk.gdk.POINTER_MOTION_HINT_MASK)

#xspixbuf = gtk.gdk.pixbuf_new_from_file("Screenshot.png")

window.add(vbox)
window.show_all()
gtk.main()

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
李晓谦

回复 李晓谦  2009年08月21日 星期五 14:36

ImportError: No module named pygtk

1条回复

夏清然

回复 夏清然  2009年08月14日 星期五 10:31

试了一下,有点意思。

0条回复

赵斌

回复 赵斌  2009年08月14日 星期五 09:19

Traceback (most recent call last):
File "code.py", line 42, in luan_clicked
draw()
File "codeo.py", line 118, in draw
w = pixbuf.get_width()
NameError: global name 'pixbuf' is not defined

0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号