Seite 1 von 1

wxTheClipBoard EVT_IDLE

Verfasst: Mittwoch 19. März 2008, 22:37
von Klip
Hallo zusammen,

ich bin ziemlicher Anfänger mit wxPython. Habe mir gerade die Videotutorials von Mr. Dale angesehen und mir gerolds Verbessungersvorschläge angesehen (vielen Dank für die anschaulichen Erklärungen!).

Ich spiele jetzt gerade etwas mit wxPython herum und bin dabei auf ein Problem gestoßen: Ich würde gerne Text aus dem Clipboard entnehmen und in ein wx.TextCtrl einfügen. Ich habe einen Beispielcode gefunden (http://wiki.wxpython.org/ClipBoard), der bei mir so aber nicht funktioniert. Ich vermute, der Code von der Seite ist veraltet.

Ich habe es jetzt probiert, so umzusetzen. Wenn ich das Script ausführe, bekomme ich allerdings die Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "./cc.py", line 29, in <module>
    frame = MainWindow()
  File "./cc.py", line 14, in __init__
    EVT_IDLE(self,self.paste)
NameError: global name 'EVT_IDLE' is not defined
Anscheinend gibt es das Event nicht. Was habe ich für Alternativen?

So sieht mein Code aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*- 

import wx
version = "0.8"

class MainWindow(wx.Frame):
	def __init__(self,parent = None,id = -1,title = "clipcat - "+version):
		wx.Frame.__init__(
			self, parent, id, title, size = (400,200),
			style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
		)
		self.control = wx.TextCtrl(self,-1,style = wx.TE_MULTILINE)
		EVT_IDLE(self,self.paste)

		self.Show(True)

	def paste(self, evt):
		do = wxTextDataObject()
		wxTheClipBoard.Open()
		success = wxTheClipBoard.GetData(do)
		wxTheClipBoard.Close()
		if success:
			self.control.SetValue(do.GetText())
		else:
			self.control.SetValue("No data.")

app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()

del frame
del app
System:
Ubuntu Gutsy Gibbon
Python 2.5.1
python-wxgtk2.8

Ich würde mich über Hilfe sehr freuen =)

Re: wxTheClipBoard EVT_IDLE

Verfasst: Mittwoch 19. März 2008, 23:27
von Leonidas
Klip hat geschrieben:Ich spiele jetzt gerade etwas mit wxPython herum und bin dabei auf ein Problem gestoßen: Ich würde gerne Text aus dem Clipboard entnehmen und in ein wx.TextCtrl einfügen. Ich habe einen Beispielcode gefunden (http://wiki.wxpython.org/ClipBoard), der bei mir so aber nicht funktioniert. Ich vermute, der Code von der Seite ist veraltet.
Richtig. Uralt. Macht man nun so. D.h. Man nutzt eine Bind-Funktion und einen symbolischen Namen des Events statt den Event als Funktion zu benutzen. Viel logischer und klarer, weniger C++-mäßig.

Danke für die Antwort :)

Verfasst: Donnerstag 20. März 2008, 07:36
von Klip
Okay, dachte ich es mir :D

Hm, der Link hilft mir nicht viel... ich muss ja wissen, wann das Clipboard einen Inhalt hat. Ich kann die GUI in dem Fall schlecht von der Logik trennen, weil ich ohne wxW nicht auf das Clipboard zugreifen kann, oder?

Ich will ja eigentlich nur überprüfen, wann das Clipboard einen Inhalt hat. Von daher müsste es doch reichen, wenn ich ein "self.paste" ins __init__ einfüge...

Bin gerade noch auf der Arbeit, aber ich probiere es zu Hause sofort mal.

Verfasst: Donnerstag 20. März 2008, 09:06
von Leonidas
Sorry, habe dir den falschen Thread gepostet, meinte eigentlich diesen hier, siehe dort die Bind-Sachen. :oops:

Verfasst: Donnerstag 20. März 2008, 10:04
von Klip
Errare humanum est ;)

Ich danke dir, Leonidas. Das mit den Bindings war mir noch nicht bekannt. Das vereinfacht die Sache ja enorm :D

Wenn ich das richtig verstehe, kann ich durch Bind ein Event mit einer Methode verbinden. Um zu erreichen, dass der Inhalt des Clipboards immer angezeigt wird, muss ich also EVT_IDLE an die paste-Methode binden.

Ich melde mich nochmal, ob alles klappt, bin gespannt :)

Beste Grüße
Klip

Verfasst: Donnerstag 20. März 2008, 16:43
von Klip
Sorry für den Doppelpost, aber ich wollte noch eine Erfolgsmeldung geben!

Es hat endlich geklappt =)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*- 

import wx
version = "0.8"

class MainWindow(wx.Frame):
	def __init__(self,parent = None,id = -1,title = "clipcat - "+version):
		wx.Frame.__init__(
			self, parent, id, title, size = (400,200),
			style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
		)
		self.control = wx.TextCtrl(self,-1,style = wx.TE_MULTILINE)
		self.Bind(wx.EVT_IDLE, self.paste)

		self.Show(True)


	def paste(self, event):
		do = wx.PyTextDataObject()
		wx.TheClipboard.Open()
		success = wx.TheClipboard.GetData(do)
		wx.TheClipboard.Close()
		if success:
			self.control.SetValue(do.GetText())
		else:
			self.control.SetValue("No data.")


app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()

del frame
del app
Das ist der funktionierende Code :) Ich werde weitere daran arbeiten und probieren, ihn zu verbessern. Vielen Dank nochmal für die Hinweise. Ich musste noch etwas in der Doku zu wxPython stöbern, aber es hat sich bezahlt gemacht! [/code]