hjälp med curses

  • Författare
  • Meddelande
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg19 nov 2014, 22:23

Du skapar en matris, och du skriver den till filen. Men var fyller du den med tecken? När du skriver ut tecknet till skärmen, så vill du dessutom spara samma tecken i matrisen. Jag kan inte se att du gör det.

Ungefär i samband med denna raden:
Kod: Markera allt
        # Draw out the char at cursor position
        scr.addstr(ch)


Så saknas något i stil med
Kod: Markera allt
        matris[x, y] = ch
...
..:
.... /mos

nibv

css-hackare

  • Inlägg: 20
  • Blev medlem: 01 sep 2014, 08:44

Re: hjälp med curses

Inlägg20 nov 2014, 00:31

såg att mos precis svarade, och förstår inte hur jag kan radera ett inlägg :-)

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg22 nov 2014, 22:32

Hallå igen.

Ok, nu ligger landet som följer.
Jag förstår hur matrisen skapas och jag fattar att den ska skapa en lista per rad istället för Sjuttifjorton listor per rad. Detta har jag kontrollerat externt genom att skriva in koden i Python och printat den.
Så långt rätt.
Jag förstår också (nu) hur main loopen fungerar.
While true, så väntar den på ett knapptryck via scr.getkey().
Den går igenom listan av alternativ och utför önskat kommando.
Vid en förflyttning med piltangenter så ändrar den y värdet eller x värdet som från början är yc och xc åt det hållet som reglerna säger. Den kollar även att koordinaten är innanför spelplanen.
Efter att den ändrat koordinaten så skriver scr.addstr(ch) ut den bokstaven som ligger i variabeln ch på den plats markören står på.
Här har jag lagt in att den via matris[x][y] = ch så den lägger in bokstaven även i matrisminnet.
Efter detta flyttar scr.move markören till den plats som koordinaterna säger samt för att få den utritad ritar scr.refresh() om skärmen.

Så mycket har jag förstått och jag har fått en output till min textfil. Sen är den helt ologisk då den skriver allt på samma rad Y = 0 samt att det är väldigt många mer bokstäver än vad jag har lagt in.
Har försökt återskapa detta i python radvis men där fungerar matrisen och jag kan lägga in saker där de hör hemma. Skulle vara bra att kunna felsöka ett curses program så man faktiskt ser vad som händer, lägga in printar osv så man vet vad som felar.
Hur som helst skriver jag såhär mest för att själv förstå och för att få feedback på om jag tänker helt galet.
Det är något som är fel och jag kommer säkerligen fråga en massa gånger på detta men jag tänker inte ge upp. Curses ska inte vinna den här striden :)
Min kod.
https://dl.dropboxusercontent.com/u/53028645/border.py

grni14

html-kodare

  • Inlägg: 19
  • Blev medlem: 31 aug 2014, 20:04

Re: hjälp med curses

Inlägg23 nov 2014, 14:46

Samma rad blir det för att du antagligen har öppnat filen i notepad och notepad tolkar inte "\n" som radbrytning.

Så här gör du nu:
Kod: Markera allt
for y in range(y1-1):
  for row in matrix:
    f.write("".join(row) + "\n")


Dvs, lika många ggr som det finns kolumner skriver du ut matrisens alla rader. Och det räcker ju att du skriver ut all rader en gång, så ta bort första for-loopen.

Dessutom, iom att du skapar matrisen så här:
Kod: Markera allt
matrix = [['' for _ in range(x1-1)] for _ in range(y1-1)]

så betyder det att där du ännu inte skrivit något till matrisen finns det en tom sträng. Det innebär att när du sedan skriver matrisen till fil så kommer alla dessa platser i matrisen att representeras av en tom sträng. Och då tappar du positionerna när det väl hamnar i filen eftersom tom sträng plus tom sträng är lika med tom sträng. Jag rekommenderar att du byter till ' ' istället, alltså ett mellanslag.

Angående debuggning så kan du skriva dina printar till fil istället.
Dvs definiera en funktion såhär ex:

Kod: Markera allt
def debug(s):
    with open("debug.txt", "a") as fd:
        fd.write(str(s) + "\n")


Sedan är det bara att anropa funktionen när du vill skriva ut något och kolla i debug.txt vad det blev. Men undvik notepad då.

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg23 nov 2014, 20:55

Ok, jag får kolla in det här. Tack!
Men om jag inte borde använda notepad för att kolla på textfiler i programmeringssammanhang vad ska jag använda?
Rekommendationer? Vill ju ha en textläsare som faktiskt fungerar så som jag vill i just dessa sammanhang.

grni14

html-kodare

  • Inlägg: 19
  • Blev medlem: 31 aug 2014, 20:04

Re: hjälp med curses

Inlägg24 nov 2014, 00:37

Jag använder emacs men det har ganska hög tröskel.
Om du använder windows så är notepad++ rätt bra.

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg24 nov 2014, 13:05

OJ! Det ser ju faktiskt ut som det ska göra med Notepad++
Tack!

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg02 dec 2014, 21:55

Jag har nu fått ut det som finns i filen på skärmen.
Men jag får det på fel ställe.
Det känns som om det beror lite på vart markören är när jag trycker på "o".

Kod: Markera allt
        elif key == 'o':
            #scr.clear()
            #scr.border()
            with open('border.txt', 'r') as f:
                content = f.read().splitlines()
                for y in range(0, len(matrix)):
                    matrix[y] = list(content[y])
            for row in matrix:
                print("".join(row))

Vad tror ni kan vara fel?

Hur som helst så har det dykt upp två andra fel som jag inte fattar hur de ens uppstår = jag kan inte lösa dem.
När jag la till
Kod: Markera allt
matrix[y][x] = ch
under delen som ritar ut tecknet på skärmen så kan jag inte längre scrolla längst ned till botten eller längst till höger utan att få detta felmeddelande.
Kod: Markera allt
    matrix[y][x] = ch
IndexError: list index out of range


Om jag ändå håller mig i rutan och gör tecken lite överallt så får jag oftast till slut detta felmeddelande:
Kod: Markera allt
    scr.addstr(ch)
_curses.error: addstr() returned ERR


Någon som kan förklara detta?
Tack!
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg03 dec 2014, 10:04

I exemplet matrix/domatrix.py visar jag hur du sparar en liknande matris till fil.
https://github.com/mosbth/python/blob/m ... py#L39-L41

Kod: Markera allt
def saveMatrix(matrix):
    """
    Save the content of the matrix to a file. Do this by joining all items in the
    list and create a string-representing the row and write that string to the file.
    Add a newline to each row.
    """
    with open(filename, 'w') as f:
        for row in matrix:
            f.write("".join(row) + '\n')


Jämför du med din egen kod så ser du en viss skillnad:
Kod: Markera allt
        elif key == 's':
            with open('border.txt', 'w') as f:
                for y in range(y1-1):
                    for row in matrix:
                        f.write("".join(row) + "\n")


Raden:
Kod: Markera allt
                for y in range(y1-1):


gör att din textfil blir onödigt stor.
...
..:
.... /mos

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg03 dec 2014, 12:47

Tack Mos men det är redan löst.
Det blev en dubblett på den loopen där vilket gjorde massor av knasiga saker.
Nu är det inläsningen som spökar.
...
Ja .. och de andra sakerna.

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg04 dec 2014, 12:55

*bump*
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg04 dec 2014, 14:09

quaglamorf skrev:Nu är det inläsningen som spökar.
...
Ja .. och de andra sakerna.


Om det är *bump* på dessa så kanske du vill utveckla dem lite? Vad försöker du göra, vad händer, vilken del av koden pratar vi om? Så löser vi det också.
...
..:
.... /mos

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg04 dec 2014, 14:24

quaglamorf skrev:Jag har nu fått ut det som finns i filen på skärmen.
Men jag får det på fel ställe.
Det känns som om det beror lite på vart markören är när jag trycker på "o".

Kod: Markera allt
        elif key == 'o':
            #scr.clear()
            #scr.border()
            with open('border.txt', 'r') as f:
                content = f.read().splitlines()
                for y in range(0, len(matrix)):
                    matrix[y] = list(content[y])
            for row in matrix:
                print("".join(row))

Vad tror ni kan vara fel?

Hur som helst så har det dykt upp två andra fel som jag inte fattar hur de ens uppstår = jag kan inte lösa dem.
När jag la till
Kod: Markera allt
matrix[y][x] = ch
under delen som ritar ut tecknet på skärmen så kan jag inte längre scrolla längst ned till botten eller längst till höger utan att få detta felmeddelande.
Kod: Markera allt
    matrix[y][x] = ch
IndexError: list index out of range


Om jag ändå håller mig i rutan och gör tecken lite överallt så får jag oftast till slut detta felmeddelande:
Kod: Markera allt
    scr.addstr(ch)
_curses.error: addstr() returned ERR


Någon som kan förklara detta?
Tack!


Jag postar detta igen, det verkar som om du missat att jag skrev det.
Det jag behöver hjälp med är att få utskriften att "hamna" rätt. Samt de lustiga felen som har dykt upp i samband med mina tillägg i filen.
Tack!
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg04 dec 2014, 16:07

Hur ser hela din kod ut?
...
..:
.... /mos

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg05 dec 2014, 10:19

Trixet i övningen är när flera saker samverkar, man behöver dela upp dem i delar och lösa var del för sig.

Jag tog din öppna-del och tog bort kopplingen till matrisen. Bara för att få att läsa från fil och skriva ut att fungera.

Kod: Markera allt
        elif key == 'o':
            scr.clear()

            with open('border.txt', 'r') as f:
                content = f.read().splitlines()
           
            for yy in range(len(content)):
                scr.move(yy, 1)
                scr.addstr(content[yy])
       
            scr.move(y, x)
            scr.border()
            continue       
...
..:
.... /mos

quaglamorf

php-programmerare

  • Inlägg: 49
  • Blev medlem: 07 sep 2014, 19:21

Re: hjälp med curses

Inlägg08 dec 2014, 13:02

aha.. Man är tvungen att flytta cursorn till varje rads placering.
Funderade på om Addstr skulle användas men fick det aldrig att lira.
Nu funkar de två delarna iaf.

Men hur är det med list index out of range problemet som dök upp när jag la till matric[y][x] = ch raden?
Känns eventuellt att det kan bli knas i framtiden när vi bygger på detta programmet om jag inte kan scrolla till höger kant eller botten utan att det crashar.
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg08 dec 2014, 13:38

quaglamorf skrev:Men hur är det med list index out of range problemet som dök upp när jag la till matric[y][x] = ch raden?
Känns eventuellt att det kan bli knas i framtiden när vi bygger på detta programmet om jag inte kan scrolla till höger kant eller botten utan att det crashar.


Ja, det är ett bekymmer. Kan du kommentera bort användandet av matrix, så att du inte får ett fel. Pröva sen att flytta runt till alla hörnen, går det bra, utan felmeddelanden?

Det är steg 1. Sedan kan du lägga tillbaka matrix-delen igen (ta bort kommentaren), får du felet åt alla fyra hållen? Det ser ut som din matrix - i så fall - är mindre än den ritbara ytan på skärmen. Då anpassar man matrix-storlek så att den är så stor som den skrivbara ytan på skrämen.

Men börja med att testa utan matrix. man delar in problemet i två steg och löser först det ena.
...
..:
.... /mos

andreas.ranman

html-kodare

  • Inlägg: 11
  • Blev medlem: 22 aug 2014, 14:53

Re: hjälp med curses

Inlägg17 dec 2014, 10:20

Fliker in lite här då jag också sitter fast med curses.

Mitt problem ligger i värdena jag läser in...

scr.inch ger ju en int - och dokumentationen säger att det bara är de 'lägre' 8-bitsen som håller på själva tecknet jag är ute efter.

medan jag ser här att ni använder scr.instr så får jag bara tokiga värden som:
b"lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk"

Vilket jag varken med chr() eller .decode('utf-8') får till något läsbart och vettigt.
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 11065
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: hjälp med curses

Inlägg17 dec 2014, 11:32

Ett snabbt svar:
Kod: Markera allt
ch = chr(ch & 0x00ff)


Man strippar bort de högre 8 bitarna som innehåller attributes (stil, blink, bakgrundsfärg) och omvandlar siffran till ett asciivärde. Som det står i manualen.
window.inch([y, x])
Return the character at the given position in the window. The bottom 8 bits are the character proper, and upper bits are the attributes.


För att se det i ett sammanhang så studera koden i (det nya) exemplet, border_ext.py:
https://github.com/mosbth/python/blob/m ... py#L20-L36

Där finns även en funktion som underlättar debugging i curses genom att skriva debug-meddelanden till fil.
https://github.com/mosbth/python/blob/m ... py#L10-L16

Gör bin/dbwebb update för att hämta hem det senaste exempelprogrammet curses/border_ext.py.
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Bing [Bot], MSN [Bot] och 15 gäster