Die ausgabe Sortiert nach zahlen ausgeben

Code-Stücke können hier veröffentlicht werden.
Antworten
gregor20sw
User
Beiträge: 6
Registriert: Samstag 10. November 2018, 22:10

Hallo ich möchte das die Ausgabe sortiert ausgegeben wird, nach zahlen und dann nach Buchstaben. Ich bekomme es nicht hin und wäre euch sehr dankbar wenn ihr mir dabei helfen könntet.
Das Programm, nimmt bash.sh Scripts und gibt sie auf ein Fenster wieder, Mann kann sie dann auswählen und starten. Aber sie werden leider nicht sortiert angezeigt.

Code: Alles auswählen

from Screens.Screen import Screen
from Components.ActionMap import ActionMap, NumberActionMap
from Components.MenuList import MenuList
from Components.Sources.List import List
from Screens.Console import Console
from Plugins.Plugin import PluginDescriptor
from Components.Button import Button
from Components.Label import Label

import os



path = "/usr/lib/enigma2/python/Plugins/Extensions/Run_Script/scripts/"

class Run_Script(Screen):

        skin = """
        	<screen name="System Information" position="center,center" size="650,500" title="" >

                <widget name="list" position="75,50" size="405,300" scrollbarMode="showOnDemand" />
		<!--eLabel position="70,100" zPosition="-1" size="100,69" backgroundColor="#222222" /-->
                <widget name="info" position="40,170" zPosition="4" size="680,200" font="Regular;18" foregroundColor="#ffffff" transparent="1" halign="left" valign="center" />
	        <!--ePixmap name="red"    position="10,400"   zPosition="2" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
	        <ePixmap name="green"  position="150,400" zPosition="2" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
	        <ePixmap name="yellow" position="290,400" zPosition="2" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" /> 
        	<ePixmap name="blue"   position="430,400" zPosition="2" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" /> 

        	<widget name="key_red" position="10,400" size="140,40" valign="center" halign="center" zPosition="4"  foregroundColor="white" font="Regular;20" transparent="1" shadowColor="#25062748" shadowOffset="-2,-2" /> 
        	<widget name="key_green" position="150,400" size="140,40" valign="center" halign="center" zPosition="4"  foregroundColor="white" font="Regular;20" transparent="1" shadowColor="#25062748" shadowOffset="-2,-2" /> 
                <widget name="key_yellow" position="290,400" size="140,40" valign="center" halign="center" zPosition="4"  foregroundColor="white" font="Regular;20" transparent="1" shadowColor="#25062748" shadowOffset="-2,-2" />
        	<widget name="key_blue" position="430,400" size="140,40" valign="center" halign="center" zPosition="4"  foregroundColor="white" font="Regular;20" transparent="1" shadowColor="background" shadowOffset="-2,-2" /-->
                </screen>"""


	def __init__(self, session, args = 0):
		self.session = session
		Screen.__init__(self, session)
		self.skinName = "Run_Script"
		self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
		{
			"ok": self.action,
			"cancel": self.close,

		}, -1)

		self["list"] = MenuList([])
		self["info"] = Label()
		self.slist = []
                title = "System Information"
                self.setTitle(title)

		for root, dirs, files in os.walk(path):
			for name in files:
                               self.slist.append(name[:-3])

                self["list"].setList(self.slist)
			
	def action(self):
	        sel = self["list"].getSelectionIndex()
                if sel is not None:
                       self.shname = self.slist[sel] + ".sh"
                       self.cmd = path + self.shname
                       self.viewLog()
                else:
                       return

	def viewLog(self):
                title = _(self.shname[:-3])
#                print "self.cmd", self.cmd
                self.session.open(Console2,_(title),[self.cmd])
###################################

from enigma import eConsoleAppContainer
from Screens.Screen import Screen
from Components.ActionMap import ActionMap
from Components.ScrollLabel import ScrollLabel

class Console2(Screen):
	#TODO move this to skin.xml
	skin = """
		<screen position="150,100" size="1070,425" title="Command execution..." >
			<widget name="text" position="50,20" size="1000,375" font="Console;22" foregroundColor="#bab329" />
		</screen>"""
		
	def __init__(self, session, title = "Console", cmdlist = None, finishedCallback = None, closeOnSuccess = False):
		Screen.__init__(self, session)

		self.finishedCallback = finishedCallback
		self.closeOnSuccess = closeOnSuccess

		self["text"] = ScrollLabel("")
		self["actions"] = ActionMap(["WizardActions", "DirectionActions"], 
		{
			"ok": self.cancel,
			"back": self.cancel,
			"up": self["text"].pageUp,
			"down": self["text"].pageDown
		}, -1)
		
		self.cmdlist = cmdlist
		self.newtitle = title
		
		self.onShown.append(self.updateTitle)
		
		self.container = eConsoleAppContainer()
		self.run = 0
		self.container.appClosed.append(self.runFinished)
		self.container.dataAvail.append(self.dataAvail)
		self.onLayoutFinish.append(self.startRun) # dont start before gui is finished

	def updateTitle(self):
		self.setTitle(self.newtitle)

	def startRun(self):
#		self["text"].setText(_("Execution Progress:") + "\n\n")
#                self["text"].setText(_(""))
		print "Console: executing in run", self.run, " the command:", self.cmdlist[self.run]
		if self.container.execute(self.cmdlist[self.run]): #start of container application failed...
			self.runFinished(-1) # so we must call runFinished manual

	def runFinished(self, retval):
		self.run += 1
		if self.run != len(self.cmdlist):
			if self.container.execute(self.cmdlist[self.run]): #start of container application failed...
				self.runFinished(-1) # so we must call runFinished manual
		else:
			str = self["text"].getText()
			str += ("\n" + _("Execution finished!!"));
			self["text"].setText(str)
			self["text"].lastPage()
			if self.finishedCallback is not None:
				self.finishedCallback()
			if not retval and self.closeOnSuccess:
				self.cancel()

	def cancel(self):
		if self.run == len(self.cmdlist):
			self.close()
			self.container.appClosed.remove(self.runFinished)
			self.container.dataAvail.remove(self.dataAvail)

	def dataAvail(self, str):
		self["text"].setText(self["text"].getText() + str)



###################################

def startConfig(session, **kwargs):
        session.open(Run_Script)

def mainmenu(menuid):
        if menuid != "mainmenu":
                return [ ]
        return [(_("Run_Script"), startConfig, "Run_Script", None)]

def Plugins(**kwargs):
	 return [PluginDescriptor(name=_("Run_Script"), where = PluginDescriptor.WHERE_MENU, fnc=mainmenu)]












__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sind 100e Zeilen zusammenkopierter Code für ein eher randständiges Thema. Das macht es schwer zu eruieren, was genau du da tust und verändern willst. Bitte zeig mal den relevanten Code, und beschreibe genauer, was der tut, und was der tun soll.
gregor20sw
User
Beiträge: 6
Registriert: Samstag 10. November 2018, 22:10

Das ist es eben, ich habe von Programmierung so gut wie keine Ahnung, ich kann bash Scripte einigermaßen schreiben, ich habe diesen Programm gefunden, und ein paar nette Scripts geschrieben. Wo man irgendwas ändert das frage ich mich auch, ich schaue es mir immer wieder an und werde nicht wirklich schlau, meine Hoffnung seit ihr.
Das was ich sagen kann ist das ich in den ordner "/usr/lib/enigma2/python/Plugins/Extensions/Run_Script/scripts/" zb. 01_shutdown.sh und 02_online_test.sh ablege und dann werden mir die scripte 02_online_test und 01_shutdown zb. angezeigt, und ich wünsche mir das sie 01... 02.... in der reienvolge angezeigt werden.
in diesen teil wird .sh nicht angezeigt

Code: Alles auswählen

	def action(self):
	        sel = self["list"].getSelectionIndex()
                if sel is not None:
                       self.shname = self.slist[sel] + ".sh"
                       self.cmd = path + self.shname
                       self.viewLog()
                else:
                       return
ich denke das so ein block eingefügt werden muss, der die scripte wie sei angezeigt werden sortiert. So denke ich
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Füg mal vor

Code: Alles auswählen

self["list"].setList(self.slist)
Diese Zeile ein - gleiche Einrückungstiefe wie die Zeile, die ich genannt habe!

Code: Alles auswählen

self.slist.sort(key=lambda n: os.path.basename(n))
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@gregor20sw: das Problem ist, dass das nicht wirklich schönes Python ist und hier niemand weiß, was von Dir stammt, und was Du irgendwoher zusammenkopiert hast.

In `Run_Script.__init__` müßtest Du z.B. os.listdir statt walk benutzen, weil Du Unterverzeichnisse sowieso nicht nutzen kannst. Eine Prüfung, ob die Endung wirklich .sh ist fehlt. Und hier fehlt auch das Sortieren.

Code: Alles auswählen

	def __init__(self, session, args = 0):
		self.session = session
		Screen.__init__(self, session)
		self.skinName = "Run_Script"
		self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
		{
			"ok": self.action,
			"cancel": self.close,

		}, -1)

		self["info"] = Label()
                title = "System Information"
                self.setTitle(title)

		scripts = []
		for name in os.listdir(path):
			if name.endswith('.sh'):
                               scripts.append(name[:-3])

		self["list"] = MenuList(sorted(scripts))
			
	def action(self):
	        script = self["list"].getCurrent()
                if sel is not None:
                       self.shname = script + ".sh"
                       self.cmd = path + self.shname
                       self.viewLog()
gregor20sw
User
Beiträge: 6
Registriert: Samstag 10. November 2018, 22:10

__deets__ hat geschrieben: Sonntag 11. November 2018, 09:59 Füg mal vor

Code: Alles auswählen

self["list"].setList(self.slist)
Diese Zeile ein - gleiche Einrückungstiefe wie die Zeile, die ich genannt habe!

Code: Alles auswählen

self.slist.sort(key=lambda n: os.path.basename(n))
ich habe es so eingefügt, es geht leider nicht

Code: Alles auswählen

		for root, dirs, files in os.walk(path):
			for name in files:
                               self.slist.append(name[:-3])
							   
		self.slist.sort(key=lambda n: os.path.basename(n))
                self["list"].setList(self.slist)
			
	def action(self):
	        sel = self["list"].getSelectionIndex()
                if sel is not None:
                       self.shname = self.slist[sel] + ".sh"
                       self.cmd = path + self.shname
                       self.viewLog()
                else:
                       return
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

"geht nicht" ist eine sehr schlechte Fehlerbeschreibung. Was passiert?
Und danke, dass Du meine Antwort ignorierst.
gregor20sw
User
Beiträge: 6
Registriert: Samstag 10. November 2018, 22:10

Sirius3 hat geschrieben: Sonntag 11. November 2018, 14:54 "geht nicht" ist eine sehr schlechte Fehlerbeschreibung. Was passiert?
Und danke, dass Du meine Antwort ignorierst.
Danke euch allen erstmals für die Hilfe. Sirus ich habe es nicht selbst geschrieben. es ist für eine Dreambox bzw. für einen Enigma2 reciver geschrieben. und wenn ich die Box neu starte kann die .py datei nicht kompiliert werden und somit verschwindet das Programm bei den plugins. Daher geht nicht, ich weiß das ich die Fehlermeldung von der Konsole euch zeigen muss. ich weiß aber nicht wie ich dieses Programm starten kann im terminal
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann kann man halt auch schlecht helfen. Übrigens hast Du munter Leerzeichen und Tabs gemischt, da kann es dann passieren, dass Python meckert. Versuch mal nur Tabs als Einrückung zu benutzen.
gregor20sw
User
Beiträge: 6
Registriert: Samstag 10. November 2018, 22:10

Also jetzt bin ich drauf gekommen wie ich eine Kosnolen ausgabe bekome. das ist die ausgabe

Code: Alles auswählen

		for root, dirs, files in os.walk(path):
			for name in files:
                               self.slist.append(name[:-3])
							   
				self.slist.sort(key=lambda n: os.path.basename(n))			   
                self["list"].setList(self.slist)
			
	def action(self):
	        sel = self["list"].getSelectionIndex()
                if sel is not None:
                       self.shname = self.slist[sel] + ".sh"
                       self.cmd = path + self.shname
                       self.viewLog()
                else:
                       return
File "/usr/lib/enigma2/python/Plugins/Extensions/Run_Script/plugin.py", line 57
self.slist.sort(key=lambda n: os.path.basename(n))
^
IndentationError: unexpected indent
gregor20sw
User
Beiträge: 6
Registriert: Samstag 10. November 2018, 22:10

Also es hat geklappt :mrgreen:
Danke euch und vorallem __deets__

es waren die leerzeilen, das script ist so schlecht geschrieben das ich viel hin und her ausprobiert habe. und es hat funktioniert!!!!!

DANKE EUCH!!!!!!!
Antworten