-1

今、私は元々Windows用にWidgetAreaを作成しましたが、主にLinuxユーザーです。Linuxでも作りたかったのですが、主にPyGTKのファイルダイアログについてもっと学びたいと思いました。そこで、このチュートリアルを見て理解を深めると同時に、このシンプルでありながら小さなアプリケーションに取り組んでいます。これは、実験によって学習し、理解するのが簡単だからです。

これが私のソースコードです。

#!/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()

次のエラー(2番目)のため、次のコード(1番目)を削除しました。

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'

私が問題を抱えているのは、選択した画像を参照して選択するときです。上記のように、[OK]を押して、選択した画像をそのウィンドウに表示する新しいウィンドウとして起動します。

4

2 に答える 2

2

最初のエラーを修正するには、gtk.FILE_CHOOSER_ACTION_OPENの代わりにを使用しgtk.FileChooserAction.OPENます。

image2番目の問題は、コード内のその時点で名前が付けられた変数がないためです(116行目)。おそらく、C ++またはJavaのバックグラウンドから来ているimageので、を囲むクラスの属性を調べることで、のような名前を解決できますthis.image

Pythonではそれを行うことはできません。メソッドで明示的にに割り当てる必要がself.imageありますaddwidget()。それ以外の場合、名前はメソッドimageに対してローカルのままであり、addwidget()メソッドの外部では使用できません。

addwidget()これは別の問題を引き起こします。ボタンがクリックされて呼び出されるたびに何が起こりますか?self.winself.image上書きされます。それはあなたが望むものかもしれませんが、私はあなたの注意を喚起しているだけです---それは私には少し奇妙に思えます。

于 2012-05-24T09:54:21.663 に答える
1

私は自分のプロジェクトの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とは何ですか?

そして今、画像を見ることができます。

于 2012-05-24T21:11:48.920 に答える