wxTheClipBoard EVT_IDLE

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Mittwoch 19. März 2008, 22:37

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 =)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. März 2008, 23:27

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Donnerstag 20. März 2008, 07:36

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 20. März 2008, 09:06

Sorry, habe dir den falschen Thread gepostet, meinte eigentlich diesen hier, siehe dort die Bind-Sachen. :oops:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Donnerstag 20. März 2008, 10:04

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
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Donnerstag 20. März 2008, 16:43

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]
Antworten