Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.04.2013, 14:03

[Python] Liste nach einer Variable durchsuchen[SOLVED]

Ich arbeite mit der BigWorld Game Engine. Da möchte ich die Auflösungen ändern und dazu muss ich vergleichen ob die aktuelle / neue auflösung verfügbar ist.

Die auflistung der verfügbaren auflösungen erhalte ich mit:

Quellcode

1
2
3
4
5
6
7
def listVideoModes(): 
Lists video modes available on current display device. 

Returns: 

list of 5-tuples (int, int, int, int, string). (mode index, width, height, 
BPP, description) 


Mit der print funktion bekomme ich folgende aufgabe davon:

Quellcode

1
[(0, 640, 480, 32, '640x480x32'), (1, 640, 480, 16, '640x480x16'), (2, 720, 480, 32, '720x480x32'), (3, 720, 480, 16, '720x480x16'), (4, 720, 576, 32, '720x576x32'), (5, 720, 576, 16, '720x576x16'), (6, 800, 600, 32, '800x600x32'), (7, 800, 600, 16, '800x600x16'), (8, 1024, 768, 32, '1024x768x32'), (9, 1024, 768, 16, '1024x768x16'), (10, 1152, 864, 32, '1152x864x32'), (11, 1152, 864, 16, '1152x864x16'), (12, 1280, 720, 32, '1280x720x32'), (13, 1280, 720, 16, '1280x720x16'), (14, 1280, 768, 32, '1280x768x32'), (15, 1280, 768, 16, '1280x768x16'), (16, 1280, 800, 32, '1280x800x32'), (17, 1280, 800, 16, '1280x800x16'), (18, 1280, 960, 32, '1280x960x32'), (19, 1280, 960, 16, '1280x960x16'), (20, 1280, 1024, 32, '1280x1024x32'), (21, 1280, 1024, 16, '1280x1024x16'), (22, 1360, 768, 32, '1360x768x32'), (23, 1360, 768, 16, '1360x768x16'), (24, 1366, 768, 32, '1366x768x32'), (25, 1366, 768, 16, '1366x768x16'), (26, 1440, 900, 32, '1440x900x32'), (27, 1440, 900, 16, '1440x900x16'), (28, 1600, 900, 32, '1600x900x32'), (29, 1600, 900, 16, '1600x900x16'), (30, 1600, 1024, 32, '1600x1024x32'), (31, 1600, 1024, 16, '1600x1024x16'), (32, 1600, 1200, 32, '1600x1200x32'), (33, 1600, 1200, 16, '1600x1200x16'), (34, 1680, 1050, 32, '1680x1050x32'), (35, 1680, 1050, 16, '1680x1050x16'), (36, 1920, 1080, 32, '1920x1080x32'), (37, 1920, 1080, 16, '1920x1080x16')]


und ich möchte nun vergleichen ob die active auflösung in dieser liste vorhanden ist. Jemand eine Idee wie das gehen könnte.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Lajah250« (04.05.2013, 10:50)


2

20.04.2013, 15:50

Das könntest du mithilfe von List Comprehension und enumerate() lösen:

Quellcode

1
2
3
>>> matches = [i for i, t in enumerate(listVideoModes()) if t[1] == 640 and t[2] == 480]
>>> matches
[0, 1]

Das Ergebnis [0, 1] bedeutet: In listVideoModes()[0] und listVideoModes()[1] ist jeweils eine 640x480er Auflösung enthalten.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

20.04.2013, 19:42

Das schöne an Python ist doch aber, dass es noch wesentlich einfacher geht:

Quellcode

1
2
3
4
if (10, 20) in ((10, 10), (20, 10), (10, 20)): # true
    pass
if (10, 20) in ((10, 10), (20, 10)): # false
    pass


[Nachtrag:]
Ich habe wohl das Format der Auflösungen überlesen. Ist da wirklich der Index der erste Wert der Auflösung? Der müsste weggeschmissen werden und entweder der String generiert oder ebenfalls weggeschmissen werden.
Besser wäre es zu wissen, ob man die Liste auch auf andere Art ohne diese beiden (äußerst redundanten) Informationen bekommt.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (20.04.2013, 19:48)


4

20.04.2013, 20:24

Dann ist das hier vielleicht ein Kompromiss:

Quellcode

1
2
if (640, 480) in [t[1:3] for t in listVideoModes()]:
    print("Jawoll")

5

21.04.2013, 10:40

@Sacaldur: Jo der erste wer ist ein Index. Welcher nur der Zuordnung der Auflösung dient. Es gibt leider nur die möglichkeit diese liste zu bekommen.

@Endgegner: Der Code liest sich intressant. Es gibt nur eine Sache die ich nicht kenne.

Quellcode

1
t[1:3]


Für was steht dieses?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

21.04.2013, 14:10

Damit kann man von einer Liste eine Teilliste erstellen, wobei der erste Wert der inklusive Beginn-Index ist und der zweite der exklusive Endindex (das Element mit diesem Index ist nicht enthalten) ist. Bei (0, 1, 2, 3)[1:3] erhält man also (1, 2), während (0, 1, 2, 3)[0:3] einem (0, 1, 2) liefern würden. Wenn man den einen oder den anderen Wert weg lässt, dann wird automatisch der Anfang oder das Ende der Liste verwendet. ([:3] würde eine Liste mit den ersten 3 Elementen liefern, [-3:] eine Liste mit den letzten 3.)
Da Strings auf die einzelnen enthaltenen Zeichen ebenfalls mit Hilfe von Eckigen Klammern den Zugriff gewähren, kann man so einen bestimmten Teil eines Strings erhalten, vergleichbar den Substring-Methoden in anderen Sprachen
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

7

21.04.2013, 19:57

Danke für die Hilfe Leute.
Ihr habt mich auch die Richtige Spur gepracht wie der code funktioniert.

Hier ist er:

Quellcode

1
2
3
4
5
6
7
        CurrentResolution = BigWorld.videoModeIndex()
        NewResolution = CurrentResolution + 2
        if NewResolution in [ mode[0] for mode in BigWorld.listVideoModes()]:
            BigWorld.changeVideoMode( NewResolution, False )
        else:
            HalfMaxResolution = CurrentResolution / 2
            BigWorld.changeVideoMode( HalfMaxResolution, False )

8

22.04.2013, 11:58

OK ein problem ist doch noch aufgetaucht.

Mit folgenden Code lese ich die Höhe und weite der auflösung aus.

Quellcode

1
2
3
4
    def SearchWindowResoultiom():
        Width = [ mode[1] for mode in BigWorld.listVideoModes() if mode[0] == CurrentResolution ]
        Height = [ mode[2] for mode in BigWorld.listVideoModes() if mode[0] == CurrentResolution ]
        return Width, Height


Das funktioniert auch perfekt.
Ich bekomme folgende print ausgabe:

Quellcode

1
2
3
BigWorld Release Client (compiled at 12:20:30 Aug 27 2012) starting on Mon Apr 22 11:44:40 2013
[1440]
[900]


Mit folgendem code möchte ich die auflösung im Fenstermodus ändern.

Quellcode

1
2
        Width, Height = SearchWindowResoultiom()
        BigWorld.resizeWindow(Width, Height)

Da bekomme ich einen fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
BigWorld Release Client (compiled at 12:20:30 Aug 27 2012) starting on Mon Apr 22 11:37:07 2013
Traceback (most recent call last):
  File "C:/BWindie2.1/ttt/res/scripts/client\Helpers\PyGUI\Button.py", line 187, in handleMouseButtonEvent
    self._onClick()
  File "C:/BWindie2.1/ttt/res/scripts/client\Helpers\PyGUI\Button.py", line 140, in _onClick
    self.onClick()
  File "C:/BWindie2.1/ttt/res/scripts/client\AoGUI\LoginSettingsWindow.py", line 31, in ResolutionBtnClicked
    Settings.ChangeResolution()
  File "C:/BWindie2.1/ttt/res/scripts/common\Settings.py", line 36, in ChangeResolution
    BigWorld.resizeWindow( Width, Height )
TypeError: () argument 1 must be set to an int


Kann ich die Return ausgabe irgendwie in eine int umwandeln??

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

22.04.2013, 13:48

Die Fehlerausgabe deutet auf einen falschen Parameter hin. Den falschen Parameter bekommst du, weil deine Auswertung, ob eine Auflösung unterstützt wird, nicht richtig ist. Du überprüst nur, ob die Zahl CurrentResolution als Index in der Liste der Auflösungen vorhanden ist und für alle Auflösungen mit diesem Index dir die Breite und Höhe geben lässt. Da dies eine Menge von Auflösungen ist, hast du auch eine Menge (Liste) von Breiten und Höhen, auch wenn sie jeweils nur 1 Element beinhalten. (Sieht man an deiner Ausgabe, um die Zahlen sind eckige Klammern, weshalb es Listen und nicht nur Zahlen sind.)

Du solltest nach Möglichkeit nochmal überdenken, was dein Code eingentlich machen soll. Ich denke mal, folgendes ist das, was du bisher erreichen willst:
schau nach, ob die aktuell eingestellte Auflösung (Desktopauflösung) unterstützt wird
wenn ja: stelle diese ein
dafür würde ich mir die Funktion definieren:

Quellcode

1
2
3
4
5
6
def resize(width, height):
    if (width, height) in [t[1:3] for t in listVideoModes()]:
        BigWorld.resizeWindow(height, width)
        return True
    else:
        return False

Die ich ungefähr so aufrufen würde:

Quellcode

1
2
3
4
5
resolution = (1440, 900) # die Auflösung, die gesetzt werden soll

# evtl. andere Operationen ...

resize(resolution[0], resolution[1])


Was noch fehlt ist die Fehlerbehandlung: Was soll passieren, wenn die Auflösung nicht gesetzt werden kann? Soll eine andere Auflösung probiert werden? Soll eine Fehlermeldung ausgegeben werden? Soll einfach nichts gemacht werden?

alternativ könnte man auch eine Funktion/Methode schreiben, die ausschließlich prüft, ob das Wechseln der Auflösung möglich ist und eine, die dann ausschließlich die Änderung durchführt.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige