2012-05-24 25 views
-1

现在我为Windows创建了WidgetArea,但主要是Linux用户。我也想为Linux做好准备,但主要是为了更多地了解PyGTK中的文件对话框。所以我看了一下this教程,以便更好地理解它,同时开发这个简单而又小巧的应用程序,因为这对我来说更容易学习,并通过实验来理解。PyGTK FileChooserDialog保持错误

所以这里是我的源代码。

#!/usr/bin/env python 

import sys, os 
import pygtk, gtk, gobject 
import pygst 
pygst.require("0.10") 
import gst 

class WidgetArea(gtk.Window): 

    def addwidget(self, w): 
    self.win = gtk.Window(gtk.WINDOW_TOPLEVEL) 
    self.win.set_title("Widget") 
    self.win.set_decorated(False) 
    self.win.set_has_frame(False) 
    self.win.set_resizable(False) 
    self.win.set_keep_above(True) 
    self.win.set_property('skip-taskbar-hint', True) 
    self.previewimage = gtk.Image() 
    self.win.add(self.previewimage) 
    self.win.show_all() 

    def pinning(self, checkbox): 
    if checkbox.get_active(): 
    self.set_keep_above(True) 
    else: 
    self.set_keep_above(False) 

    def change_size(self, w): 
    width = int(self.entryw.get_text()) 
    height = int(self.entryh.get_text()) 
    self.win.set_size_request(width,height) 

    def __init__(self): 
    super(WidgetArea, self).__init__() 
    self.set_position(gtk.WIN_POS_CENTER) 
    self.set_title("WidgetArea") 
    self.set_resizable(False) 
    self.set_keep_above(True) 
    self.set_property('skip-taskbar-hint', True) 
    self.connect("destroy", gtk.main_quit, "WM destroy") 
    vbox = gtk.VBox(spacing=0) 
    hbox = gtk.HBox(spacing=0) 
    hbox2 = gtk.HBox(spacing=0) 
    hbox3 = gtk.HBox(spacing=0) 
    hbox4 = gtk.HBox(spacing=0) 

    self.widgetsize = gtk.Label("Widget Size:") 
    self.widgetsize.set_size_request(100, 30) 

    self.entryw = gtk.Entry() 
    self.entryh = gtk.Entry() 
    self.entryw.set_text("270") 
    self.entryw.set_size_request(75, 30) 
    labelcoma = gtk.Label(",") 
    labelcoma.set_size_request(10, 30) 
    self.entryh.set_text("221") 
    self.entryh.set_size_request(75, 30) 
    labelspac1 = gtk.Label(" ") 
    labelspac1.set_size_request(10, 30) 
    hbox.pack_start(self.widgetsize) 
    hbox.pack_start(self.entryw) 
    hbox.pack_start(labelcoma) 
    hbox.pack_start(self.entryh) 
    hbox.pack_start(labelspac1, 0, 0, 10) 

    check = gtk.CheckButton("Pin This Window") 
    check.set_active(True) 
    check.connect("clicked", self.pinning) 
    hbox.pack_start(check, 0, 0, 10) 

    labelspac2 = gtk.Label(" ") 
    labelspac2.set_size_request(250, 15) 
    hbox2.pack_start(labelspac2) 

    filefilter = gtk.FileFilter() 
    filefilter.set_name("Images") 
    filefilter.add_mime_type("image/png") 
    filefilter.add_mime_type("image/jpeg") 
    filefilter.add_mime_type("image/gif") 
    filefilter.add_mime_type("image/tiff") 
    filefilter.add_mime_type("image/svg+xml") 
    filefilter.add_pattern("*.jpg") 

    self.ref_file_button = gtk.FileChooserButton('Add Widget') 
    self.ref_file_button.set_current_folder("/".join([self.rootdir,"pics"])) 
    self.ref_file_button.set_filter(filefilter) 
    self.ref_file_button.connect("file-set", self.on_open_clicked) 
    hbox3.pack_start(self.ref_file_button, 150, 150, 10) 

    labelspac5 = gtk.Label(" ") 
    labelspac5.set_size_request(0, 10) 
    hbox4.pack_start(labelspac5) 

    vbox.pack_start(hbox) 
    vbox.pack_start(hbox2) 
    vbox.pack_start(hbox3) 
    vbox.pack_start(hbox4) 
    self.add(vbox) 
    self.show_all() 

    def on_open_clicked(self, widget, data=None): 
    ref_image_path = widget.get_filename() 
    self.previewimage.set_from_file(ref_image_path) 
    self.addwidg.connect("clicked", self.addwidget) 
    self.addwidg.connect("clicked", self.change_size) 
    ref_image_path.destroy() 

WidgetArea() 
gtk.gdk.threads_init() 
gtk.main() 

我删除了下面的代码(第1),由于下面的错误(第2)。

self.ref_file_button.set_current_folder("/".join([self.rootdir,"pics"])) 

Traceback (most recent call last): 
    File "./widgetarea.py", line 109, in <module> 
    WidgetArea() 
    File "./widgetarea.py", line 86, in __init__ 
    self.ref_file_button.set_current_folder("/".join([self.rootdir,"pics"])) 
AttributeError: 'WidgetArea' object has no attribute 'rootdir' 

现在这在这一点上没什么大不了的。我的主要目标是让图像显示在新窗口中。所以在我删除了上面的代码之后,由于那个错误,我得到了另一个。

Traceback (most recent call last): 
    File "./widgetarea.py", line 103, in on_open_clicked 
    self.previewimage.set_from_file(ref_image_path) 
AttributeError: 'WidgetArea' object has no attribute 'previewimage' 

所有我遇到的问题是,当你浏览选择我要选择的图像,按下时确定启动在该窗口中显示所选择的图像的新窗口中的图像,如上所述。

回答

1

我在我的一个项目中使用过类似的东西。在Linux中它对我来说很好。

def __init__(self): 
    # Define all the widgets 
    image_filter = gtk.FileFilter() 
    image_filter.set_name("Images") 
    image_filter.add_mime_type("image/png") 
    image_filter.add_mime_type("image/jpeg") 
    image_filter.add_mime_type("image/gif") 
    image_filter.add_mime_type("image/tiff") 
    image_filter.add_mime_type("image/svg+xml") 
    image_filter.add_pattern("*.jpg") 

    self.ref_file_button = gtk.FileChooserButton('Select Image') 
    self.ref_file_button.set_size_request(100,30) 
    self.ref_file_button.set_current_folder("/".join([self.rootdir,"pics"])) # set directory path 
    self.ref_file_button.set_filter(image_filter) 
    self.ref_file_button.set_tooltip_text('Select Image') 
    self.ref_file_button.connect("file-set", self.ref_image_selected) 

def ref_image_selected(self,widget,data=None): 
    ref_image_path = widget.get_filename() 
    print ref_image_path 

获取图像的路径后,您可以使用gtk.Image

加载它

编辑:

你的代码是有点错误的。你永远不会调用函数addwidget(),因此self.previewimage没有定义。所以它给了AttributeError。

def __init__(self): 
    # your code 
    self.add(vbox) 
    self.addwidget(200) # I don't know what 'w' is. so I took a random number. 
    self.show_all() 

def on_open_clicked(self, widget, data=None): 
    ref_image_path = widget.get_filename() 
    self.previewimage.set_from_file(ref_image_path) 
    self.addwidg.connect("clicked", self.addwidget) 
    self.addwidg.connect("clicked", self.change_size) 
    ref_image_path.destroy() 

什么是self.addwidg

我现在可以查看图像了。

+0

更新的代码和说明。 –

+1

你的addwidget()函数永远不会被调用。所以,self.previewimage = gtk.Image()不会发生。所以,它给出的错误:AttributeError:'WidgetArea'对象没有属性'previewimage' – Froyo

+0

lol我忘了最重要的部分| self.addwidg是一个按钮,但我删除了它。大声笑感谢您的帮助,并为ptomato。 –

2

要更正第一个错误,请使用gtk.FILE_CHOOSER_ACTION_OPEN而不是gtk.FileChooserAction.OPEN

第二个问题是因为在代码中没有名为image的变量(第116行)。也许你来自C++或Java背景,可以通过查看封闭类的属性(如this.image)来解析名称如image

在Python中,你不能这样做。您必须在您的addwidget()方法中明确指定self.image。否则,名称image保持在addwidget()方法的本地,并且在其外部不可用。

这引发了一个不同的问题,每次按钮被点击并调用addwidget()时会发生什么? self.winself.image被覆盖。这可能是你想要的,但我只是把它叫到你的注意---这对我来说似乎有点奇怪。