Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Na początku napiszę, że nigdy nic nie pisałem w Pythonie. Znam dość dobrze shella, trochę perl-a i liznąłem JavaScript, ale z Pythonem dotychczas nie miałem do czynienia.
Zachciało mi się (a właściwie zostałem zmuszony) napisać własny plazmoid do KDE. Ma robić bardzo prostą rzecz: wypisywać do swojego wnętrza wyjście z wcześniej zdefiniowanego polecenia.
Znalazłem sobie taki przykład:
http://iaimz091.informatik.uni-mainz.de/site/?p=1
Zrobiłem wszystko wedle instrukcji, zamieniając tylko w odpowiednim miejscu "uptime" na moje polecenie (zrobiony dawno temu skrypt w bash-u). Zainstalowałem, wszystko poszło OK. Po uruchomieniu jednak zamiast polskich znaków diakrytycznych mam krzaki. Najpierw myślałem że to kwestia fontu, ale gdy udało mi się go zmienić na taki, który na pewno polskie znaki ma, nic się nie poprawiło.
Gdy w skrypcie jest linijka:
text = commands.getoutput(cmd).encode('utf8')
to przy uruchomieniu skryptu otrzymuję:
Traceback (most recent call last): File "/usr/share/kde4/apps/plasma_scriptengine_python/pyappletscript.py", line 117, in paintInterface self.pyapplet.paintInterface(painter, option, contentsRect) File "/home/minio/sources/uptime/contents/code/main.py", line 43, in paintInterface text = commands.getoutput(cmd).encode('utf8') UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)
wnioskuję — może niepoprawnie — że Python wyjście tego polecenia tratuje jako ciąg znaków ASCII i stąd cały problem.
Pytanie więc brzmi: co mam zrobić, żeby przekonać go, że ten ciąg znaków jednak jest zakodowany w UTF-8?
(Wszędzie indziej w KDE, także w już istniejących plazmoidach, polskie znaki wyświetlają się poprawnie, dlatego przypuszczam że to jednak wina Pythona.)
Ostatnio edytowany przez Minio (2011-05-30 15:20:07)
Offline
Generalnie miałem rację.
Zamieniłem commands (który rzekomo jest już deprecated) na subprocess i jakoś bangla. Pełen kod plasmoida (może się komuś przyda):
# -*- coding: utf-8 -*- # myPlasmoid/contents/code/main.py #import kde and qt specific stuff from PyQt4.QtCore import * from PyQt4 import QtGui from PyKDE4.plasma import Plasma from PyKDE4 import plasmascript #import commands for executing shell commands from subprocess import Popen, PIPE #Plasmoid gained by inheritance class myPlasmoid(plasmascript.Applet): #constructor def __init__(self,parent,args=None): plasmascript.Applet.__init__(self,parent) #done once when initiating def init(self): #disable settings dialog self.setHasConfigurationInterface(False) #set size of Plasmoid self.resize(450, 45) #set aspect ratio mode self.setAspectRatioMode(Plasma.IgnoreAspectRatio) #set timer interval in ms (1000=1s) self.startTimer(2000) #done when timer is resetted def timerEvent(self, event): #call draw method self.update() #draw method def paintInterface(self, painter, option, rect): #command to be executed in shell cmd = "logout.sh --print-only" stdout = Popen(cmd, shell=True, stdout=PIPE).stdout text = stdout.read().decode('utf8') #set pen color and draw text painter.save() painter.setPen(Qt.black) painter.setFont(QtGui.QFont("Inconsolata", 12)) painter.drawText(rect, Qt.AlignLeft, text) painter.restore() def CreateApplet(parent): return myPlasmoid(parent)
Offline
Strony: 1