Python proje yardımı

Arkadaşlar Merhaba öncelikle sitede aranıza yeni katıldım.Şu ara okulum için üzerinde çalıştığım bi form uygulamam var ve bazı sorunlar yaşıyorum ve sizden destek alabileceğimi düşündüm.

Uygulamamda Tkinter ile bi form oluşturdum.Bu form üzerinde butonlar var.Butonlara tıklandığında tıklanan butonun etrafındaki butonlar renk değiştiriyor ve butonun sayı numarasını ekrana yazdırıyor.Benim sorun yaşadığım kısım ise tam burası işlem gerçekleşiyor fakat sürekli hata raporu veriyor “command = lambda num = sn : cevredekiler(num)+yaz2(num))
TypeError: unsupported operand type(s) for +: ‘NoneType’ and ‘NoneType’” şurada bir sorun olduğunu söylüyor.Bunu nasıl halletmem gerek yaptığım yanlış nedir python programlamada yeniyim daha yeni bazı şeyleri öğreniyorm.

Ayrıca bu programa bir de bu gerçekleşen işlemleri veri tabanına aktarmak istesem hangi fonksiyonları kodları kullanmam gerek yazarsanız sevinirim.

Eğer bu şekilde yardım edemeziseniz kodlarıda paylaşabilirim.

Kodu bu linke göre sorunuza eklerseniz daha kolay yardım ederiz:

Ayrıca hatanızın sebebinin cevredekiler(num)+yaz2(num) kısmından kaynaklandığı belli. İki fonksiyon da değer döndürmüyor, yani None döndürüyor. Ve siz iki None’u toplamaya çalışıyorsunuz. Sanırım buradaki amacınız bu iki fonksiyonu da çağırmak. Böyle durumlarda lambda kullanmak doğru değil. Çünkü lambda fonksiyonlar ile yapabileceklerimiz sınırlı.


command = lambda num = sn : cevredekiler(num) or yaz2(num)

Şeklinde hoş olmayan bir hileye başvurabilirsiniz, ancak eğer lambda fonksiyonu işinizi görmüyorsa en iyisi normal bir fonksiyon tanımlamaktır:

def buton_basıldı():
    cevredekiler(sn)
    yaz2(sn)

Ve daha sonra da

command = buton_basıldı

Yanıtınız için teşekkür ederim sorunum çözüldü.

Bu uygulamada benim yapmak istediğim birşey daha var fakat ben tam olarak bulamadım böyle bişey
Yapmak istediğim butona tıklandığında numarayı ekrana yazdırıyor fakat bu yazdırdığı numarayı ben veri tabanına nasıl aktarabilirim.Bir değişken tanımlayıp veri tabanına ekleme işlemini bu değişken üzerinden nasıl yaparım.

-- coding: cp1254 --

##Veri tabanı bağlantısı.
##import sqlite3
##bag = sqlite3.connect(“dugmeler.db”)
#sql = bgl.cursor()

#Veri tabanı işlemleri.
##def tablo_olustur():

sql.execute(“create table if not exists dugmeler(numara int)”)

bag.commit()

def renkdegistir(numara):

dugmeler[numara][“text”] = “ali”

dugmeler[numara]["bg"],dugmeler[numara]["fg"] = dugmeler[numara]["fg"],dugmeler[numara]["bg"]

def cevredekiler(numara):
listem =
satir = numara/suts
sutun = numara%suts
for eleman in range(max(0,satir-1),min(satir+2,sats)):
for eleman2 in range(max(0,sutun-1),min(sutun+2,suts)):
listem.append(eleman*suts+eleman2)
for eleman3 in listem:
renkdegistir(eleman3)

def yaz2(numara):
print numara

from Tkinter import *
form = Tk()
dugmeler =
sats = 8
suts = 8
sku = 20
uku = 20
ym = 20
dm = 20
bg = 80
by = 30
genislik = sutsbg+(suts-1)ym+2sku
yukseklik = sats
by+(sats-1)dm+2uku
form.title(u"Form Uygulaması 04")
form.geometry(“%sx%s-100+100”%(genislik,yukseklik))

for sn in range(sats*suts):

dugme = Button(form,text=u"Düğme "+str(sn), bg = "blue", fg = "yellow", font = "arial 12 bold",
               command = lambda num = sn : cevredekiler(num) or yaz2(num))

             
dugme.place(x = (sn%suts)*(bg+ym)+sku, y = (sn/suts)*(by+dm)+uku, height = by, width = bg)
dugmeler.append(dugme)

mainloop()

birde bu butonun etrafında yanan numaraların bilgisinin aktarılma işleminide yapmak istesem böyle bişey mümkün olur mu ?

Kodunuzun her satırının başına > koymak yerine kodunuzun başladığı yere ve bittiği yere ``` koyun. Markdownu yanlış kullandığınız için kodunuz garip durmuş.

Sorunuza gelince, eğer sadece bir sayıyı kaydedecekseniz bir kütüphane kullanmanıza gerek yok. Sadece bir dosyayı açıp kendiniz de sayıyı yazabilirsiniz. Eğer veritabanı kullanmanız şart değil ise ve sadece birkaç değişkeni saklayacaksanız bir dosyaya değişkenlerinizi kendiniz yazmanız daha mantıklı olacaktır.

Bu işlemleri otomatik gerçekleştirmesi lazım butona tıklanınca.Şöyle söyleyim 20 adet buton var formun içerisinde tıklanılan butonun numarası ekrana yazdırılıyor şuan ve bununla birlikte tıklanılan butonların numaralarının kayıtlarının veri tabanına aktarılmasını istiyorum.Bunu nasıl yapabilirim?

Sanırım beni tam olarak anlamadınız. Bu dediklerininizi yapmak kolay. Benim dediğim şu ki eğer sqlite kullanmanız ödeviniz için şart değilse ve uygulamanızda sadece basılan butonun numarasını kayıt edecekseniz bir dosyaya yazma işlemlerini kendiniz yapmanız daha doğru olur. sqlite kullanmanız şart mı?

Evet sql kullanmam gerekiyor projede.Uğraştırıyorum sizide kusura bakmayın lütfen

Peki yapamadığınız yer neresi?

Bu dediğimi uygulayın lütfen, kodunuz kötü duruyor.

# -*- coding: cp1254 -*-
##Veri tabanı bağlantısı.
import sqlite3
baglan = sqlite3.connect("dugmeler.db")
sql = baglan.cursor()

#Veri tabanı işlemleri.
def tablo_olustur():
    sql.execute("create table if not exists dugmeler(tiklananNo int)")
    baglan.commit()

def kayit_ekle(tiklananNo):
    sql.execute("insert into dugmeler values ('%s')"%(tiklananNo))
    baglan.commit()

##def kayit_listele():
##    kayitseti = sql.execute("select * from dugmeler")
##    kayitlar = kayitseti.fetchall()
##    for kayit in kayitlar:
##        print kayit

tablo_olustur()

def renkdegistir(numara):
##    dugmeler[numara]["text"] = "ali" 
    dugmeler[numara]["bg"],dugmeler[numara]["fg"] = dugmeler[numara]["fg"],dugmeler[numara]["bg"]

def cevredekiler(numara):
    listem = []
    satir = numara/suts
    sutun = numara%suts
    for eleman in range(max(0,satir-1),min(satir+2,sats)):
        for eleman2 in range(max(0,sutun-1),min(sutun+2,suts)):
            listem.append(eleman*suts+eleman2)
    for eleman3 in listem:
        renkdegistir(eleman3)

def yaz2(numara):
    print numara
   
##def dbgonder(numara):
##    kayit_ekle(numara)
##    print ("Veri tabanına tıklanan buton numarası aktarıldı.!")
   
from Tkinter import *
form = Tk()
dugmeler = []
sats = 8
suts = 8
sku = 20
uku = 20
ym = 20
dm = 20
bg = 80
by = 30
genislik = suts*bg+(suts-1)*ym+2*sku
yukseklik = sats*by+(sats-1)*dm+2*uku
form.title(u"Buton Uygulaması")
form.geometry("%sx%s-100+100"%(genislik,yukseklik))


for sn in range(sats*suts):
    
    dugme = Button(form,text=u"Düğme "+str(sn), bg = "blue", fg = "yellow", font = "arial 12 bold",
                   command = lambda num = sn : cevredekiler(num) or yaz2(num))
                                     
    dugme.place(x = (sn%suts)*(bg+ym)+sku, y = (sn/suts)*(by+dm)+uku, height = by, width = bg)
    dugmeler.append(dugme)



##kayit_listele()

baglan.close()

mainloop()

Yapmak istediğim dbgonder fonksiyonuna uygun düzenleme yapıp tıklanan buton numarasını veri tabanına kayıt etmek.

Yine yanlış işaret kullandınız :smiley: ``` Bu üç işareti kopyalayıp kodunuzun başına ve sonuna koyabilirsiniz. Yeni bir mesaj atmak yerine eskisini değiştirmeniz daha iyi olacaktır.

Bende diyorum ne oldu bu :smiley:

1 Beğeni

Neden python2 kullanıyorsunuz?

Bunu gerçekten bende çok sordum ama bi cevabı yok muhtemelen okul bilgisayarlarında hazırda bu olduğu için derstede bunu kullanıyoruz. :smiley:

Okulda bunun kullanılması yanlış bir şey. Bir teknolojinin neden en yeni halini öğretmiyorlar anlamadım.

Sanırım bu kod istediğiniz gibi çalışıyor (tabii birkaç değişim yapmanız gerekecek çünkü ben python3 kullanıyorum):

import sqlite3
baglan = sqlite3.connect("dugmeler.db")
sql = baglan.cursor()

#Veri tabanı işlemleri.
def tablo_olustur():
    sql.execute("create table if not exists dugmeler(tiklananNo, int)")
    baglan.commit()

sıra = 0

def kayit_ekle(tiklananNo):
    global sıra
    sql.execute("insert into dugmeler values (%s, %s)"%(tiklananNo, sıra))
    sıra += 1
    baglan.commit()

def kayit_listele():
    kayitseti = sql.execute("select * from dugmeler")
    kayitlar = kayitseti.fetchall()
    for kayit in kayitlar:
        print(kayit)

tablo_olustur()

def renkdegistir(numara):
##    dugmeler[numara]["text"] = "ali" 
    dugmeler[numara]["bg"],dugmeler[numara]["fg"] = dugmeler[numara]["fg"],dugmeler[numara]["bg"]

def cevredekiler(numara):
    listem = []
    satir = numara//suts
    sutun = numara%suts
    for eleman in range(max(0,satir-1),min(satir+2,sats)):
        for eleman2 in range(max(0,sutun-1),min(sutun+2,suts)):
            listem.append(eleman*suts+eleman2)
    for eleman3 in listem:
        renkdegistir(eleman3)

def yaz2(numara):
    print(numara)
   
def dbgonder(numara):
    kayit_ekle(numara)
    print ("Veri tabanına tıklanan buton numarası aktarıldı.!")
   
from tkinter import *
form = Tk()
dugmeler = []
sats = 8
suts = 8
sku = 20
uku = 20
ym = 20
dm = 20
bg = 80
by = 30
genislik = suts*bg+(suts-1)*ym+2*sku
yukseklik = sats*by+(sats-1)*dm+2*uku
form.title(u"Buton Uygulaması")
form.geometry("%sx%s-100+100"%(genislik,yukseklik))


for sn in range(sats*suts):
    
    dugme = Button(form,text=u"Düğme "+str(sn), bg = "blue", fg = "yellow", font = "arial 12 bold",
                   command = lambda num = sn : cevredekiler(num) or yaz2(num) or dbgonder(num))
                                     
    dugme.place(x = (sn%suts)*(bg+ym)+sku, y = (sn/suts)*(by+dm)+uku, height = by, width = bg)
    dugmeler.append(dugme)



kayit_listele()

mainloop()

baglan.close()

Ufak bi derleme denedim ama sağlıklı çalışmadı malesef.

Nesi istediğiniz gibi değil? Bir de siz eski programa ait verilerin kalmasını istiyor musunuz?

kayit_ekle()

TypeError: kayit_ekle() takes exactly 1 argument (0 given)

Şöyle bi hata alıyorum bu dbgonder fonksiyonunu kullandığımda normal çalışıyor aslında ama veri tabanına ekleme işlemini gerçekleştirmiyor.

def dbgonder(numara):
    kayit_ekle(numara)
    print ("Veri tabanına tıklanan buton numarası aktarıldı.!")
def kayit_ekle(tiklananNo):

dbgonder ve kayit_ekle fonksiyonları basılan butonun numarasını parametre olarak alıyor.

Peki parametre olarak alıyor ise bu parametreyi bi değişkene atayıp kayıt_ekle(parametre) gibi bişey yazarak veri tabanına aktarabilirmiyiz