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




Użyszkodnik
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




Użyszkodnik
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