Vinnaren i pepparkakshustävlingen!
2020-12-20, 12:13
  #1669
Medlem
Zabriskie.Points avatar
Försöker damma av mina programmeringskunskaper och känner mig just nu helt jävla korkad. Sitter och försöker skapa ett gui för att visa en fråga på skärmen. Vartefter användaren ska klicka på en knapp, då ska nästa fråga visas. Frågorna är sparade i en textfil som läses in som en lista i en annan fil en den nedanför.
Jag använder mig av kivy:

Kod:
from kivy.app import App
from kivy.uix.button import Button, Label
from questions import Questions
from kivy.uix.floatlayout import FloatLayout

class TestApp(App):
    counter = 0

    def onClick():
        self.counter += 1

    def build(self):
        f = FloatLayout()
        a = Questions()
        l = Label(text=a.returnQuestion(self.counter), font_size='30')
        b0 = Button(text="0", pos=(300,350), size_hint = (.25, .1))
        b1 = Button(text="1", pos=(400, 350), size_hint=(.25, .1))
        b2 = Button(text="2", pos=(500, 350), size_hint=(.25, .1))
        b3 = Button(text="3", pos=(600, 350), size_hint=(.25, .1))
        b0.bind(on_press=onClick)
        f.add_widget(l)
        l.add_widget(b0)
        b0.add_widget(b1)
        b1.add_widget(b2)
        b2.add_widget(b3)
        return f




TestApp().run()

Fellmeddelandet säger: NameError: name 'onClick' is not defined
Hur kommer sig detta? Känns som det är något vääldigt basalt jag missat.

För övrigt, om det går förstå hur jag försöker "få till det": hur borde jag lägga upp koden i gui-filen?
Citera
2020-12-20, 13:48
  #1670
Medlem
Citat:
Ursprungligen postat av Zabriskie.Point
Försöker damma av mina programmeringskunskaper och känner mig just nu helt jävla korkad. Sitter och försöker skapa ett gui för att visa en fråga på skärmen. Vartefter användaren ska klicka på en knapp, då ska nästa fråga visas. Frågorna är sparade i en textfil som läses in som en lista i en annan fil en den nedanför.
Jag använder mig av kivy:

Kod:
from kivy.app import App
from kivy.uix.button import Button, Label
from questions import Questions
from kivy.uix.floatlayout import FloatLayout

class TestApp(App):
    counter = 0

    def onClick():
        self.counter += 1

    def build(self):
        f = FloatLayout()
        a = Questions()
        l = Label(text=a.returnQuestion(self.counter), font_size='30')
        b0 = Button(text="0", pos=(300,350), size_hint = (.25, .1))
        b1 = Button(text="1", pos=(400, 350), size_hint=(.25, .1))
        b2 = Button(text="2", pos=(500, 350), size_hint=(.25, .1))
        b3 = Button(text="3", pos=(600, 350), size_hint=(.25, .1))
        b0.bind(on_press=onClick)
        f.add_widget(l)
        l.add_widget(b0)
        b0.add_widget(b1)
        b1.add_widget(b2)
        b2.add_widget(b3)
        return f




TestApp().run()

Fellmeddelandet säger: NameError: name 'onClick' is not defined
Hur kommer sig detta? Känns som det är något vääldigt basalt jag missat.

För övrigt, om det går förstå hur jag försöker "få till det": hur borde jag lägga upp koden i gui-filen?

Om du sätter def onClick(self) och sen kallar på den med self.onClick. Känns som att det kan fungera men har aldrig använt kivy så.
Citera
2020-12-20, 14:48
  #1671
Medlem
Zabriskie.Points avatar
Citat:
Ursprungligen postat av Boven541
Om du sätter def onClick(self) och sen kallar på den med self.onClick. Känns som att det kan fungera men har aldrig använt kivy så.


Helt rätt! Tackar ödmjukast
Citera
2020-12-22, 00:19
  #1672
Medlem
Zabriskie.Points avatar
Ännu en fråga ang Kivy:

Hur f-n ska jag få en CheckBox att reseta sig till icke-aktiv? Har suttit med detta flera timmar nu.


main.py
Kod:
from kivy.app import App
from kivy.uix.checkbox import CheckBox
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button


class TheStore(FloatLayout):
    chk = ObjectProperty(True)
    def __init__(self, **kwargs):
        super(TheStore, self).__init__(**kwargs)

    def restore(self):
        self.chk = ObjectProperty(False)


class CheckTest(App):
    def build(self):
        return TheStore()

if __name__ == '__main__':
    CheckTest().run()


checktest.kv
Kod:
<TheStore>:
    CheckBox:
        active: root.chk
    Button:
        on_press: root.restore()
        size_hint: 1, 0.3


Har skalat ner allt för att enbart fokusera på detta problemet. Hoppas ni förstår vad jag menar. Kan förtydliga:
Vill klicka i en checkbox, när jag trycker på knappen ska den återställas och vara obockad.


Tack på förhand!

Dessutom:

Har inte riktigt förstått vad denna kodraden gör:
Kod:
super(TheStore, self).__init__(**kwargs)

samt:
varför orsakar följande en krasch:
Kod:
from kivy.app import App
from kivy.uix.checkbox import CheckBox
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button


class TheStore(FloatLayout):
    
    def __init__(self, **kwargs):
        super(TheStore, self).__init__(**kwargs)
        self.chk = ObjectProperty(True)  #  <----------  Denna rad är flyttad (enda ändringen)

    def restore(self):
        self.chk = ObjectProperty(False)


class CheckTest(App):
    def build(self):
        return TheStore()

if __name__ == '__main__':
    CheckTest().run()



EDIT:
Upptäckte nu att om jag INTE fyller i checkboxen (den är obockad) och jag sen trycker på knappen så bockas den. Vadan detta?! (Allt jag egentligen vill göra är ju att invertera detta beteende)
__________________
Senast redigerad av Zabriskie.Point 2020-12-22 kl. 00:26.
Citera
2020-12-30, 16:13
  #1673
Medlem
Citat:
Ursprungligen postat av Zabriskie.Point
Ännu en fråga ang Kivy:

Hur f-n ska jag få en CheckBox att reseta sig till icke-aktiv? Har suttit med detta flera timmar nu.
Aldrig använt kivy men det jag kan tipsa om är att printa värden till terminalen för att felsöka.

Exempelvis:
i restore-funktion printar du värdet på chk, samt nuvarande värdet på checkboxen.
Gör detta BÅDE före och efter att du tilldelar chk ett nytt värde - på så vis kan du se om värdena ändras korrekt och om problemet ligger i att variabeln chk inte uppdateras eller om problemet snarare kanske gäller att bindingen av checkboxen inte fungerar.

Spontant gissar jag att det är ett problem med binding, så brukar det vara när det gäller GUI-element som ska uppdateras automatiskt till värdet av en variabel.
Citera
2021-02-13, 14:53
  #1674
Medlem
Någon som kan komma på varför SqlAlchemy och Psycop2 hatar min query?

Jag har en liten misstanke om att den inte gillar både min all()/first()-funktion i filter() samt min limit() som kan göra att limit får fnatt om query inte hittar tillräckligt med rader för limit(), då jag sätter query() för att filtrera bort rader som har blockering i objektet Adress och samtidigt ser till att inte hämta mer än till senaste tidpunkten för min förra query (den som heter msg_obj.date ==date (msg_obj är här en variabel för flera olika typer av objekt som kan hämtas från).

date är en str(), som du ser i definitionen (via type hints )

Den verkar klaga på att min operator > inte vill ta int()? Den skall inte ta det heller, den skall ge mig en bool()

Varning för en otroligt stickande och bulkig kod!
(Ja, jag använder type hints!)

Kod:
def query_blocked_limited (msg_obj:Any, quant:int, date:str) -> List[Message or Saved_message]:

		return Db.session.query(msg_obj)\
				.filter(~msg_obj.adress.in_(Db.session.query(Adress.ric)\
				.filter(Adress.blocked ==True)).all(),\
				 msg_obj.id_ > Db.session.query(msg_obj.id_)\
				.filter(msg_obj.date ==date).first())\
				.order_by(msg_obj.id_.desc()).limit(quant).all()
Får följande Errors från Psycop2:



Sist men inte minst: Någon som vet hur man gör dessa query läsbara? De är ju helt horribla att läsa.
Citera
2021-03-07, 18:56
  #1675
Medlem
Jag försöker göra en request via requests där jag hämtar data för flera bolag via en batch request enligt nedan (jag har gjort ett förenklat exempel)

Kod:
request_symbols = ["A","B","C"]
result = requests.get(f"http://somesite.com/symbols={request_symbols})

detta funkar fint så länge allt är frid och fröjd med ["A","B","C"] men om exempelvis "B" skulle saknas faller hela requesten. I mitt case har jag en lång lista.

Hur kan jag Hoppa över en request som failar i en batch request?

Vore extremt tacksam för hjälp.
Citera
2021-03-10, 18:47
  #1676
Medlem
Citat:
Ursprungligen postat av dwon
Jag försöker göra en request via requests där jag hämtar data för flera bolag via en batch request enligt nedan (jag har gjort ett förenklat exempel)

Kod:
request_symbols = ["A","B","C"]
result = requests.get(f"http://somesite.com/symbols={request_symbols})

detta funkar fint så länge allt är frid och fröjd med ["A","B","C"] men om exempelvis "B" skulle saknas faller hela requesten. I mitt case har jag en lång lista.

Hur kan jag Hoppa över en request som failar i en batch request?

Vore extremt tacksam för hjälp.


För att hjälpa dig behöver vi nog veta hur apin för sidan är uppbyggd. Du kan ju alltid köra den säkra före den osäkra och iterera genom din request_symbols och köra en get per bolag. Det blir många gets, javisst, men hur skall du annars veta om ett bolag inte finns med i just en av get du gör?

Med flera bolag låter det som att du hämtar börsnoteringar, eller hur?

Man kan ju göra en safe med:

Kod:
Try:
    
request_symbols = ["A","B","C"]
    
result requests.get(f"http://somesite.com/symbols={request_symbols})

Except <<sätt in fel här>>:
        if ..... == 404: #eller vad det nu är för felkod du får ut
                twmp_req= request_symbols.copy()
                temp_req.remove(objektet du nu får felkod på)
                result = requests.get(f"
http://somesite.com/symbols={temp_req}) 


Nu prövar den att köra din get, fungerar den inte och du får en felkod så ser du till att ta bort den felande bolaget ur listan. Sedan skickar du förfrågan igen. Men du kommer att stöta på patrull med Try/Except om get returnerar ett fel i result. Då blir det inte något akut error som Try/Except snappar upp. Det kan finnas en ErrorHandler i requests som du fyller i där jag har markerat. Då bör den hantera 200/404 errors.
Citera
2021-03-10, 20:05
  #1677
Medlem
Tack för ditt svar! Det betyder så mycket när man kämpar att någon är villig att svara.


Citat:
Ursprungligen postat av Methos
För att hjälpa dig behöver vi nog veta hur apin för sidan är uppbyggd. Du kan ju alltid köra den säkra före den osäkra och iterera genom din request_symbols och köra en get per bolag. Det blir många gets, javisst, men hur skall du annars veta om ett bolag inte finns med i just en av get du gör?

Med flera bolag låter det som att du hämtar börsnoteringar, eller hur?

Man kan ju göra en safe med:

Kod:
Try:
    
request_symbols = ["A","B","C"]
    
result requests.get(f"http://somesite.com/symbols={request_symbols})

Except <<sätt in fel här>>:
        if ..... == 404: #eller vad det nu är för felkod du får ut
                twmp_req= request_symbols.copy()
                temp_req.remove(objektet du nu får felkod på)
                result = requests.get(f"
http://somesite.com/symbols={temp_req}) 


Nu prövar den att köra din get, fungerar den inte och du får en felkod så ser du till att ta bort den felande bolaget ur listan. Sedan skickar du förfrågan igen. Men du kommer att stöta på patrull med Try/Except om get returnerar ett fel i result. Då blir det inte något akut error som Try/Except snappar upp. Det kan finnas en ErrorHandler i requests som du fyller i där jag har markerat. Då bör den hantera 200/404 errors.



Tack! Jag lyckades lösa det med en väldigt lik metod.

Kod:
request_symbols = ["A","B","C"]

for symbol in request_symbols:
  result = requests.get(f"http://somesite.com/symbols={symbol})
  try:
     result.json()
   except:
     pass


den riktiga koden

Kod:
symbol_strings = ####En lista med symboler

df = pd.DataFrame()

for symbol_string in symbol_strings:
    batch_api_call_url = f'https://cloud.iexapis.com/stable/stock/market/batch?symbols={symbol_string}&types=company&token={IEX_CLOUD_API_TOKEN}'
    data = requests.get(batch_api_call_url)
    try: 
      result = data.json()
    except:
      pass

    for symbol in symbol_string.split(','):
      try:
        symb = result[symbol]["company"]["symbol"]
        name = result[symbol]["company"]['companyName']
        ind = result[symbol]["company"]['industry']
        sect = result[symbol]["company"]['sector']
        tags = result[symbol]["company"]['tags']
        df = df.append(pd.Series([symb,name,ind,sect,tags],index = df_columns),ignore_index=True)
      except:
        pass
df


Citera
2021-03-11, 12:36
  #1678
Medlem
Citat:
Ursprungligen postat av dwon
Tack för ditt svar! Det betyder så mycket när man kämpar att någon är villig att svara.






Tack! Jag lyckades lösa det med en väldigt lik metod.


Det finns dock ett allvarligt problem med den mycket naiva metoden jag föreslog som metod 1 och som du använde här ovan: Har du 100 bolag kommer du att skicka 100 requests till servern på mindre än en sekund och serverns lär gå på knäna, eller rent av kicka ut dig för att skydda sig själv. För med den for-loopen gör du en request för varje element i listan.
Citera
2021-03-11, 12:44
  #1679
Medlem
Citat:
Ursprungligen postat av Methos
Det finns dock ett allvarligt problem med den mycket naiva metoden jag föreslog som metod 1 och som du använde här ovan: Har du 100 bolag kommer du att skicka 100 requests till servern på mindre än en sekund och serverns lär gå på knäna, eller rent av kicka ut dig för att skydda sig själv. För med den for-loopen gör du en request för varje element i listan.


tack. Servern har en batch funktion som jag anger i api:URL (https://cloud.iexapis.com/stable/stock/market/batch?symbols{symbol_string}&types=company&token={IEX_CL OUD_API_TOKEN}')

antar att denna funktion hanterar förfrågan. Kan enkelt hämta tusentals rader/bolag med ett par minuters väntetid
Citera
2021-03-11, 12:57
  #1680
Medlem
Citat:
Ursprungligen postat av dwon
tack. Servern har en batch funktion som jag anger i api:URL (https://cloud.iexapis.com/stable/stock/market/batch?symbols{symbol_string}&types=company&token={IEX_CL OUD_API_TOKEN}')

antar att denna funktion hanterar förfrågan. Kan enkelt hämta tusentals rader/bolag med ett par minuters väntetid

Ja, fast när du kör din for-loop så aktiverar du inte batchfunktionen utan du kör en effektiv DoS mot servern.


Kod:
For item in list:
     
batch_api_call_url f'https://cloud.iexapis.com/stable/stock/market/batch?symbols={item}
      data = requests.get(batch_api_call_url) 

Kommer att köras tills elementen i listan är genomkörda. Har du 20 element i listan kommer din request att köras om 20 gånger. Det oavsett om du har en batch i adressen eller inte.

Du måste hitta ett sätt där du gör request i batch EN gång, med X antal hundra element/bolag. Min metod 2 kan kanske fungera för det, då den prövar att köra batchen och sedan tar den bort de bolag som felar och kör om batchen.

Du får tänka på att Pythons for-loop inte är likt andra språk. Den är som en For each item in list. Dvs den tar varje element i listan, skickar den in i din URI och sedan skickar den i request, som singelelement.

Den kommer att se ut som :
list[A,B,C, D]
requests.gethttps://cloud.iexapis.com/stable/stock/market/batch?symbols={A})
requests.gethttps://cloud.iexapis.com/stable/stock/market/batch?symbols={B})
requests.gethttps://cloud.iexapis.com/stable/stock/market/batch?symbols={C})
requests.gethttps://cloud.iexapis.com/stable/stock/market/batch?symbols={D})
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback