2015年1月24日 星期六

pygtk圖片,隨著視窗改變大小(更新)


 寫了一個image_viewport類別,繼承Gtk.Image,其實還不熟,沒呼叫super,先不管這有沒有,看重點__init__(self,image, viewport)是建構式,初始化物件,self是自帶,就image,viewport這2個參數,
 其實我只用到3個方法def i_get_viewport_h_size,def i_get_viewport_w_size,def i_image_resize(self,widget,viewport,filepath),不知為什用Anjata在開的副程式file,註解打中文,無法執行,註解只好敲我超爛程度的英文

size_image.py程式

from gi.repository import Gtk, GdkPixbuf, Gdk
import sys,os
from gi.repository.GdkPixbuf import Pixbuf, InterpType
class image_viewport(Gtk.Image):

 def __init__(self,image, viewport):
        #inital data
        self.w_size=0
        self.h_size=0
        self.image = image
        self.viewport = viewport
 def i_set_image(self,image):
       self.image= image
     
 def i_get_image(self,image):
       return self.image
 def i_set_viewport(self,viewport):
       self.viewport= viewport
 def i_get_viewport(self):
       return self.viewport
 def i_get_viewport_h_size(self):
       return self.h_size
 def i_get_viewport_w_size(self):
       return self.w_size     
     
 def i_image_resize(self,widget,viewport,filepath):
    
        self.h_size=viewport.get_allocation().height
        self.w_size=viewport.get_allocation().width
        #put image to buffer
        pixbuf = Pixbuf.new_from_file(filepath)
        #reset size
        pixbuf = pixbuf.scale_simple(self.w_size, self.h_size, InterpType.BILINEAR)
        #set buffer to image
        widget.set_from_pixbuf(pixbuf)

 在主程式,一開始,初始化產生了一個image_viewport實體,叫self.image_viewport_new
        #初始化,產生自定義image_viewport CLASS
        self.image_viewport_new=size_image.image_viewport(self.image,self.viewport)

在主程式,IMAGE_VIEWER是檔案選擇器按鈕,連結信號method

 def IMAGE_VIEWER(self, widget, *event):
        #取得file
        self.file=self.filechooserbutton.get_filename()
        #i_image_resize方法,image跟viewport一樣大小
        self.image_viewport_new.i_image_resize(widget,self.viewport,self.file)


在主程式,IMAGE_RESIZE是window,check-resize連結信號method,注意要判斷,否則信號會變迴圈,一直發出信號
  
    def IMAGE_RESIZE(self, widget, *event):
      
        #目前viewport size
        w_size=self.viewport.get_allocation().width
        h_size=self.viewport.get_allocation().height
        #存在記憶體viewport size
        wv=self.image_viewport_new.i_get_viewport_w_size()
        hv=self.image_viewport_new.i_get_viewport_h_size()

      
        #檢查viewport是否改變,重設size,否則成為無窮迴圈
        if(wv!=w_size or hv!=h_size ):
           print(str(h_size))
           self.image_viewport_new.i_image_resize(widget,self.viewport,self.file)



下圖是GLADE建的window信號check-resize


主程式


#!/usr/bin/env python
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-
#
# main.py
# Copyright (C) 2015 yplin
#
# pygtk-foobar_u1410 is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pygtk-foobar_u1410 is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see .

from gi.repository import Gtk, GdkPixbuf, Gdk

import os, sys ,size_image

from gi.repository.GdkPixbuf import Pixbuf, InterpType

#Comment the first line and uncomment the second before installing
#or making the tarball (alternatively, use project variables)
UI_FILE = "src/pygtk_foobar_u1410.ui"
#UI_FILE = "/usr/local/share/pygtk_foobar_u1410/ui/pygtk_foobar_u1410.ui"


class GUI:
    def __init__(self):
        #新建了一個xml-gtk
        self.builder = Gtk.Builder()
        #把UI_FILE加到gtk,glade產生的xml
        self.builder.add_from_file(UI_FILE)
        #建立xml信號連結
        self.builder.connect_signals(self)
        #取得xml UI上所有元件
        self.file="/home/yplin/lion.png"
        self.test_w=0
        self.test_h=0
        self.label=self.builder.get_object('label1')
        self.button2=self.builder.get_object('button2')
        self.button1=self.builder.get_object('button1')
        self.button3=self.builder.get_object('button3')
        self.window=self.builder.get_object('window')
        self.fixed=self.builder.get_object('fixed1')
        self.filechooserbutton=self.builder.get_object('filechooserbutton1')
        self.image=self.builder.get_object('image1')
        self.viewport=self.builder.get_object('viewport1')
        self.image.set_from_file(self.file)
        #初始化,產生自定義image_viewport CLASS
        self.image_viewport_new=size_image.image_viewport(self.image,self.viewport)
       
    def on_window_destroy(self, widget, *event):
        Gtk.main_quit()
   
   
       
    def SHOW(self, widget, *event):
       
        #self.label.set_text(self.button2.get_label())
        #get_focus可取得激活對象
        bt_active_label=self.window.get_focus().get_label()
        #widget是指信號處理對象,用GALADE創建UI時,是為label1
        widget.set_text(bt_active_label)
        #print(user_data)
        #widget.hide()
        #除錯技巧,印出
        #print(str(self.window.get_focus().get_label()))
        #self.button1.set_label("JJJJJJ")
        #重設label位置
        #self.fixed.put(self.label, 80, 40)
    def SHOW_IMAGE(self, widget, *event):
        #取得激活對象按鈕名稱
        bt_active_label=self.window.get_focus().get_label()
        #根據按鈕名稱,顯示或隱藏圖片
        if bt_active_label=='隱藏圖片':widget.hide()
        if bt_active_label=='顯示圖片':widget.show()
        if bt_active_label=="離開":Gtk.main_quit()
    def IMAGE_VIEWER(self, widget, *event):
        #取得file
        self.file=self.filechooserbutton.get_filename()
        #i_image_resize方法,image跟viewport一樣大小
        self.image_viewport_new.i_image_resize(widget,self.viewport,self.file)
   
    def IMAGE_RESIZE(self, widget, *event):
       
        #目前viewport size
        w_size=self.viewport.get_allocation().width
        h_size=self.viewport.get_allocation().height
        #存在記憶體viewport size
        wv=self.image_viewport_new.i_get_viewport_w_size()
        hv=self.image_viewport_new.i_get_viewport_h_size()

       
        #檢查viewport是否改變,重設size,否則成為無窮迴圈
        if(wv!=w_size or hv!=h_size ):
           print(str(h_size))
           self.image_viewport_new.i_image_resize(widget,self.viewport,self.file)
       

         

         
       
       
def main():
    app = GUI()
    app.window.show()
    Gtk.main()
   
   
if __name__ == "__main__":
    sys.exit(main())

執行後如下,圖片是跟著視窗大小跑,可拉大,圖片跟著拉大,但拉大後,不能拉小,應該是Pixbuf的BUG,因為我把圖片隱藏,視窗是可拉小的







好久沒寫程式,犯了一些錯,總覺的有點那不好,不對勁,後來想到了,我已給image,viewport初始化了,記憶體已有image,viewport,在給image,viewport參數會蓋掉原先,呼喚太多次,小程式沒差,程式很大,就有差了,好的設計是越簡單,記憶體用越少越好,會給使用者更好的感受.

   #初始化,產生自定義image_viewport CLASS
        self.image_viewport_new=size_image.image_viewport(self.image,self.viewport)


def i_image_resize(self,widget,viewport,filepath):
    
       這樣寫不好,給filepath參數就可,因為參數在給image(widget),wiewport(viewport),多餘了,程式沒效率,應像下面這樣
 def i_image_resize(self,filepath):

改寫後(紅色地方是改寫地方)

size_image.py程式

from gi.repository import Gtk, GdkPixbuf, Gdk
import sys,os
from gi.repository.GdkPixbuf import Pixbuf, InterpType
class image_viewport(Gtk.Image):

 def __init__(self,image, viewport):
        #inital data
        self.w_size=0
        self.h_size=0
        self.image = image
        self.viewport = viewport
 def i_set_image(self,image):
       self.image= image
      
 def i_get_image(self,image):
       return self.image
 def i_set_viewport(self,viewport):
       self.viewport= viewport
 def i_get_viewport(self):
       return self.viewport
 def i_get_viewport_h_size(self):
       return self.h_size
 def i_get_viewport_w_size(self):
       return self.w_size      
      
 def i_image_resize(self,filepath):
   
        self.h_size=self.viewport.get_allocation().height
        self.w_size=self.viewport.get_allocation().width
        #put image to buffer
        pixbuf = Pixbuf.new_from_file(filepath)
        #reset size
        pixbuf = pixbuf.scale_simple(self.w_size, self.h_size, InterpType.BILINEAR)
        #set buffer to image
        self.image.set_from_pixbuf(pixbuf)


主程式:

#!/usr/bin/env python
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-
#
# main.py
# Copyright (C) 2015 yplin
#
# pygtk-foobar_u1410 is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pygtk-foobar_u1410 is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see .

from gi.repository import Gtk, GdkPixbuf, Gdk

import os, sys ,size_image

from gi.repository.GdkPixbuf import Pixbuf, InterpType

#Comment the first line and uncomment the second before installing
#or making the tarball (alternatively, use project variables)
UI_FILE = "src/pygtk_foobar_u1410.ui"
#UI_FILE = "/usr/local/share/pygtk_foobar_u1410/ui/pygtk_foobar_u1410.ui"


class GUI:
    def __init__(self):
        #新建了一個xml-gtk
        self.builder = Gtk.Builder()
        #把UI_FILE加到gtk,glade產生的xml
        self.builder.add_from_file(UI_FILE)
        #建立xml信號連結
        self.builder.connect_signals(self)
        #取得xml UI上所有元件
        self.file="/home/yplin/lion.png"
        self.test_w=0
        self.test_h=0
        self.label=self.builder.get_object('label1')
        self.button2=self.builder.get_object('button2')
        self.button1=self.builder.get_object('button1')
        self.button3=self.builder.get_object('button3')
        self.window=self.builder.get_object('window')
        self.fixed=self.builder.get_object('fixed1')
        self.filechooserbutton=self.builder.get_object('filechooserbutton1')
        self.image=self.builder.get_object('image1')
        self.viewport=self.builder.get_object('viewport1')
        self.image.set_from_file(self.file)
        #初始化,產生自定義image_viewport CLASS
        self.image_viewport_new=size_image.image_viewport(self.image,self.viewport)
       
    def on_window_destroy(self, widget, *event):
        Gtk.main_quit()
   
   
       
    def SHOW(self, widget, *event):
       
        #self.label.set_text(self.button2.get_label())
        #get_focus可取得激活對象
        bt_active_label=self.window.get_focus().get_label()
        #widget是指信號處理對象,用GALADE創建UI時,是為label1
        widget.set_text(bt_active_label)
        #print(user_data)
        #widget.hide()
        #除錯技巧,印出
        #print(str(self.window.get_focus().get_label()))
        #self.button1.set_label("JJJJJJ")
        #重設label位置
        #self.fixed.put(self.label, 80, 40)
    def SHOW_IMAGE(self, widget, *event):
        #取得激活對象按鈕名稱
        bt_active_label=self.window.get_focus().get_label()
        #根據按鈕名稱,顯示或隱藏圖片
        if bt_active_label=='隱藏圖片':widget.hide()
        if bt_active_label=='顯示圖片':widget.show()
        if bt_active_label=="離開":Gtk.main_quit()
    def IMAGE_VIEWER(self, widget, *event):
        #取得file
        self.file=self.filechooserbutton.get_filename()
        #i_image_resize方法,image跟viewport一樣大小
        self.image_viewport_new.i_image_resize(self.file)
   
    def IMAGE_RESIZE(self, widget, *event):
       
        #目前viewport size
        w_size=self.viewport.get_allocation().width
        h_size=self.viewport.get_allocation().height
        #存在記憶體viewport size
        wv=self.image_viewport_new.i_get_viewport_w_size()
        hv=self.image_viewport_new.i_get_viewport_h_size()

       
        #檢查viewport是否改變,重設size,否則成為無窮迴圈
        if(wv!=w_size or hv!=h_size ):
           print(str(h_size))
           self.image_viewport_new.i_image_resize(self.file)
       

         

         
       
       
def main():
    app = GUI()
    app.window.show()
    Gtk.main()
   
   
if __name__ == "__main__":
    sys.exit(main())



read more...

2015年1月23日 星期五

用pygtk寫的圖片檢視器

前面有教過GLADE產生gtk ui,現在使用GLADE再產生filechosserbutton(檔案選擇器按鈕),如下圖左上角,訊號處理打上一個method(這我打上IMAGE_VIEWER),使用者資料選image(這裡我選image1),下面MAGE_VIEWE就是處理檔案選擇器按鈕被按下後的方法


def IMAGE_VIEWER(self, widget, *event):
        file=self.filechooserbutton.get_filename()
        #print(str(self.filechooserbutton.get_current_folder_uri()))
        #print(str(file))
        widget.set_from_file(file)



看一下pygtk手冊filechosserbutton繼承如下,在FileChooser找到取得file名稱的方法get_filename(),

+-- gobject.GObject
  +-- gtk.Object
    +-- gtk.Widget
      +-- gtk.Container
        +-- gtk.Box
           +-- gtk.HBox
             +-- gtk.FileChooserButton (implements gtk.FileChooser)
 
 file=self.filechooserbutton.get_filename()取得file路徑名稱的方法
 widget.set_from_file(file)把imgage設成 file,圖片就改變了,widget變數是指信號處理對象(GLADE敲入IMAGE_VIEWER信號時,選的那個信號處理對象)
 
 再來是用GLADE產生檔案過濾器,我只想要jpg或png檔,如下圖1,filechooserbutton的一般條件選filefilter1,動作選開啟
 b然後widgets會出現filter1,點它,如下圖2,一般的模式中敲入要過濾條件(*.jpg......),如此,filechooser只會顯示過濾條件的檔案
 
 


python程式如下

 #!/usr/bin/env python
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-
#
# main.py
# Copyright (C) 2015 yplin
#
# pygtk-foobar_u1410 is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pygtk-foobar_u1410 is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see .

from gi.repository import Gtk, GdkPixbuf, Gdk

import os, sys


#Comment the first line and uncomment the second before installing
#or making the tarball (alternatively, use project variables)
UI_FILE = "src/pygtk_foobar_u1410.ui"
#UI_FILE = "/usr/local/share/pygtk_foobar_u1410/ui/pygtk_foobar_u1410.ui"


class GUI:
    def __init__(self):
        #新建了一個xml-gtk
        self.builder = Gtk.Builder()
        #把UI_FILE加到gtk,glade產生的xml
        self.builder.add_from_file(UI_FILE)
        #建立xml信號連結
        self.builder.connect_signals(self)
        #取得xml UI上所有元件
        self.label=self.builder.get_object('label1')
        self.button2=self.builder.get_object('button2')
        self.button1=self.builder.get_object('button1')
        self.button3=self.builder.get_object('button3')
        self.window=self.builder.get_object('window')
        self.fixed=self.builder.get_object('fixed1')
        self.filechooserbutton=self.builder.get_object('filechooserbutton1')
        self.image=self.builder.get_object('image1')
        self.image.set_from_file("/home/yplin/lion.png")
    def on_window_destroy(self, widget, *event):
        Gtk.main_quit()
   
   
       
    def SHOW(self, widget, *event):
       
        #self.label.set_text(self.button2.get_label())
        #get_focus可取得激活對象
        bt_active_label=self.window.get_focus().get_label()
        #widget是指信號處理對象,用GALADE創建UI時,是為label1
        widget.set_text(bt_active_label)
        #print(user_data)
        #widget.hide()
        #除錯技巧,印出
        #print(str(self.window.get_focus().get_label()))
        #self.button1.set_label("JJJJJJ")
        #重設label位置
        #self.fixed.put(self.label, 80, 40)
    def SHOW_IMAGE(self, widget, *event):
        #取得激活對象按鈕名稱
        bt_active_label=self.window.get_focus().get_label()
        #根據按鈕名稱,顯示或隱藏圖片
        if bt_active_label=='隱藏圖片':widget.hide()
        if bt_active_label=='顯示圖片':widget.show()
        if bt_active_label=='離開':Gtk.main_quit()
    def IMAGE_VIEWER(self, widget, *event):
        #取得file
        file=self.filechooserbutton.get_filename()
        #print(str(self.filechooserbutton.get_current_folder_uri()))
        #print(str(file))
        #file加入image
        widget.set_from_file(file)
def main():
    app = GUI()
    app.window.show()
    Gtk.main()
   
   
if __name__ == "__main__":
    sys.exit(main())

執行的樣子











 

read more...

2015年1月22日 星期四

pygtk中widget的隱藏和顯示

從pygtk手冊,Widget中有一個hide()的方法,Image是繼承Misc,Misc又是繼承Widget,所以這個hide()有可能,可以使用在Image類別.

順便講一下,物件導向語言的繼承

 繼承是物件導向的特性,但不是所有變數,方法都可被繼承,用遺傳來舉例,兒子可有些父親特性,但不可能全部一樣,譬如父親長的高又聰明,兒子繼成了父親長的高,但並不聰明,說兒子很高,我們會說YES,說兒子聰明,我們會說NO.
在JAVA宣告私有private變數或方法,則不能被繼承,Python我想也是差不多吧,剛開始研究python,這是題外話


從pygtk手冊,Image是這樣繼承來的


+-- gobject.GObject
  +-- gtk.Object
    +-- gtk.Widget
      +-- gtk.Misc
        +-- gtk.Image 
 
 def SHOW_IMAGE(self, widget, *event):
  #取得激活對象按鈕名稱
  bt_active_label=self.window.get_focus().get_label()
  #根據按鈕名稱,顯示或隱藏圖片
  if bt_active_label=='隱藏圖片':widget.hide()
  if bt_active_label=='顯示圖片':widget.show()
 
 上面這個 SHOW_IMAGE方法,加到上一篇文章,
 
使用GLADE建立image,然後button1,button2的 clicked signal,再加一個SHOW_IMAGE,處理對象設image1
                self.image=self.builder.get_object('image1')
  self.image.set_from_file("/home/yplin/lion.png")
 
self.builder.get_object('image1')取得image
set_from_file("/home/yplin/lion.png") 把圖片加入image widget

執行後如下
 
按顯示圖片鈕,標籤出現"顯示圖片",圖片顯示出來,



按隱藏圖片鈕,標籤出現"隱藏圖片",圖片不見了,
 

read more...

2015年1月21日 星期三

我的第一個pygtk(Python + GTK)

現在好像蠻流行Python,Python就是一種直譯式語言(script),不用編譯,就能在terminal跑,很特別Python也是物件導向語言,找好用的IDE也能提高效率,Anjuta支援Python+Gtk,使用Glade,很快的建好了Gtk UI,我是用UBUNTU1410下的Anjuta,預設gtk 3,跟gtk 2不太一樣,所有gtk 2的g改成大寫G

import Gtk 使用gtk 3模組

import gtk 使用gtk 2模組

Anjuta Ide建立Project,先用Glade建立gtk ui(滑鼠拖拖拉拉就建好了,前面文章有寫怎樣使用glade),src目錄下ui檔就是XML(如圖)

在src目錄下py檔,就是Python,程式,當初使用glade建3個button,我把信號處理,都設成SHOW(self, widget, *event) method,如何取得,當按下按鈕,SHOW(self, widget, *event) method如何得知,是那個按鈕被按下,self.window.get_focus(),意指本身,指向window,在指向激活對象,按鈕1被按下觸動SHOW method,self.window.get_focus()當然就是按鈕1,按鈕2被按下觸動SHOW method,self.window.get_focus()當然就是按鈕2,按鈕3被按下觸動SHOW method,self.window.get_focus()當然就是按鈕3,至於我為何知道用get_focus(),是看pygtk使用手冊,google找一下就有了,網路上也有很多Python教學

def SHOW(self, widget, *event):
        #self指向button,widget指信號對象此為label1
        #self.label.set_text(self.button2.get_label())
        #get_focus可取得激活對象
        bt_active_label=self.window.get_focus().get_label()

        #widget是指信號處理對象,用GALADE創建UI時,是為label1
        widget.set_text(bt_active_label)

        #print(user_data)
       
        #除錯技巧,印出
        print(str(self.window.get_focus().get_label()))
        #self.button1.set_label("JJJJJJ")
        #重設label位置
        #self.fixed.put(self.label, 80, 40)



整個程式碼(除了取得元件,和SHOW method是在加上,其餘都是IDE自動產生)

#!/usr/bin/env python
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-
#
# main.py
# Copyright (C) 2015 yplin
#
# pygtk-foobar_u1410 is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pygtk-foobar_u1410 is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see .

from gi.repository import Gtk, GdkPixbuf, Gdk
import os, sys


#Comment the first line and uncomment the second before installing
#or making the tarball (alternatively, use project variables)
UI_FILE = "src/pygtk_foobar_u1410.ui"
#UI_FILE = "/usr/local/share/pygtk_foobar_u1410/ui/pygtk_foobar_u1410.ui"


class GUI:
    def __init__(self):
        #新建了一個xml-gtk
        self.builder = Gtk.Builder()
        #把UI_FILE加到gtk,glade產生的xml
        self.builder.add_from_file(UI_FILE)
        #建立xml信號連結
        self.builder.connect_signals(self)
        #取得xml UI上所有元件
        self.label=self.builder.get_object('label1')
        self.button2=self.builder.get_object('button2')
        self.button1=self.builder.get_object('button1')
        self.button3=self.builder.get_object('button3')
        self.window=self.builder.get_object('window')
        self.fixed=self.builder.get_object('fixed1')

    def on_window_destroy(self, widget, *event):
        Gtk.main_quit()

    def SHOW(self, widget, *event):
        #self指向本身,widget指信號對象此為label1
        #self.label.set_text(self.button2.get_label())
        #get_focus可取得激活對象
        bt_active_label=self.window.get_focus().get_label()
        #widget是指信號處理對象,用GALADE創建UI時,是為label1
        widget.set_text(bt_active_label)
        #print(user_data)
       
        #除錯技巧,印出
        print(str(self.window.get_focus().get_label()))
        #self.button1.set_label("JJJJJJ")
        #重設label位置
        #self.fixed.put(self.label, 80, 40)
       
def main():
    app = GUI()
    app.window.show()
    Gtk.main()
   
   
if __name__ == "__main__":
    sys.exit(main())

執行就像下面圖






read more...

2015年1月19日 星期一

Debian6下,使用Anjuta設計c和gtk

 直接,就用Debian6的Anjuta來設計GTK,跟ubuntu1410差不多,使用GLADE,和加SINAL ACTION,請看前面文章,glade在Debian6,元件位置,大小,按著shift,然後拖曳滑鼠就可調整,微調可用鍵盤,位置在包裝選項,大小在公用選項

 callbacks.h宣告了SHOW_TEXT1(如圖)
 callbacks.c實做SHOW_TEXT1 METHOD(如圖)
也可放在main.c不過比較亂
 

 






用glade設計時,button signal對象是label會有bug,要多加swapped=no,如下面圖2


 更改完BUG,就來編譯

可以直接RUN,先建置專案,在執行,執行完若關閉視窗,要記得按Enter,如下圖



若是要在terminal編譯,步驟如下
1.

先跑一次
./autogen.sh
 2.
以後只要
make

 3.
把執行檔copy到project目錄下
cp src/執行檔
 4.執行
./執行檔

結果



因為是gtk2,ubuntu1410當然也可以跑










read more...

2015年1月17日 星期六

LINUX C/C++語言IDE編輯器Anjuta(二),gtk加入圖片

處理圖片,在window,加入fix,再加入捲動視窗(scrolledwindow),加入viewport,才能加入image

 image,檔案敲入圖片路徑(如下)
 
然後執行(下面就是執行後的樣子),視窗就出現圖片,很簡單吧!!只要寫個處理圖片路徑的method,就可當一個簡單的圖片檢視器了.


read more...

2015年1月14日 星期三

LINUX C/C++語言IDE編輯器Anjuta

之前學了一點QT屬C++,最近想學GTK加C和C++,在網路上找到Anjuta這個IDE,感覺還行,亂玩一下,大概知道了一些,在BLOG做一下筆記了

用Anjuta先建立一個GTK project,建立GTK圖形界面,選Files,會有一個副檔名ui,按右鍵,如圖,選GLADE界面程式設計,右邊會出現GTK視窗


選Palette,就會出現各種ui,用點取,加入右邊FRAME,這樣很簡單,設計出GTK視窗,再來更改個元件屬性,或加ACTION,點右邊FRAME的元件,左邊就會出現相對應Widgets
 選一般可更改一些屬性,如圖改了按鈕名稱
再來替按鈕加ACTION,選訊號,clicked選項(ACTION),處理器敲入要處理的method,使用者資訊,選要處理的對象widget,因為我要點按鈕,就會改LABEL的名稱,所以使用者資訊選label1

對clkicked連點2下,便會自動跳到處理器method(如圖)
還記得上面使用者資訊,選label1,程式就會幫我們在method中,加入OBJ,讓method可以取得(如下),不然你就要自己加,浪費時間

GObject *label1 = G_OBJECT (user_data);

再來設定label1的text

gtk_label_set_text ( label1,"我是案鈕2");


這樣用Anjuta簡單設計了一個GTK的小程式了



更新
可以用拖曳方式,更改widget位置,大小,Palette選第2項(移動符號)如圖

void
SHOW_TEXT2 (GtkButton *button, gpointer user_data)
{
    /*取得label1 OBJ*/
    GObject *label1 = G_OBJECT (user_data);
    change_label_text(label1,button);

}
自加了change_label_text這個methot,呼叫change_label_text(label1,button);把label1和button分別傳給了label和button變數
void
change_label_text(label,button)
{
    char st1[30]="你按了";
    char *st2;
   
    /*取得BUTTON label*/
    st2 =gtk_button_get_label (button);
    /*st1,st2字串相加*/
    strcat(st1,st2);
    /*重設LABEL text*/
    gtk_label_set_text ( label,st1);
}





read more...