Classtaki metodu başka bir classta çağırmak?

Merhaba. Bu konuda çok yeniyim ve kendimce ufak bir şeyler denemeye çalışıyorum. Bir yazılımcıdan aldığım tavsiye üzerine, program içindeki bölümleri class olarak tanımladım. Tabi tam anlamıyla böyle yapmam gerektiğini söylemedi, ben kendim deneme yapıyorum yalnızca :slight_smile:
Yazdığım kod şu şekilde:

import sqlite3 as sql
import tkinter as tk

class MyData:
    def __init__(self):
        self.vt = sql.connect("yeni_vertabanı.db")
        self.cursor = self.vt.cursor()
        self.cursor.execute("CREATE TABLE IF NOT EXISTS isim('isim')")

    def new_name(self, param):
        self.cursor.execute("INSERT INTO isim VALUES (?)", (param,))


class MyView:
    def __init__(self):
        self.form = tk.Tk()
        self.form.title("My Form")
        self.form.geometry("250x100+250+250")
        self.form.state("normal")
        self.form.minsize(250,100)
        self.form.maxsize(250,100)
        self.name_label = tk.Label(text="İsim: ", font="Arial 10 bold")
        self.name_label.place(x=10,y=15)
        self.name_entry = tk.Entry(width="30")
        self.name_entry.place(x=55, y=15)
        self.button = tk.Button(text="Kaydet!", width="10", height="2", command= MyData.new_name())
        self.button.place(x=95, y= 50)
        self.form.mainloop()


my_form = MyView()

Buradaki kullanım saçma mıdır? Yani hem veritabanı işlemleri için ayrı bir class, hem form işlemleri için ayrı bir class şeklinde çalışmak?

Eğer saçma veya yanlış değilse, veritabanı işlemlerindeki INSERT INTO fonksiyonunu, arayüz kısmındaki butona nasıl çağırabilirim?

Ayrıca, Mode-View-Controller Design Pattern’i bu yazdığım kod üzerinden izah edebilecek biri olursa çok makbule geçer :slight_smile:

Cevap verecek arkadaşlara şimdiden teşekkür ediyorum.

Bu sınıfın yerine sadece bir fonksiyon tanımlarsanız daha iyi olur.
Sınıfın tek amacı fonksiyon gibi davranmak gibi gözüküyor ya da ben yanılıyor olabilirim :frowning:

Sınıf içinde önceki sınıfın yerini alıcak basit bir fonksiyon yardımıyla:

import sqlite3 as sql
import tkinter as tk

cv = sql.connect("yeni.db")
new = cv.cursor()
new.execute("CREATE TABLE IF NOT EXISTS Kullanıcı(İsim)")

class MyView:
    def __init__(self):
        self.form = tk.Tk()
        self.form.title("My Form")
        self.form.geometry("250x100+250+250")
        self.form.state("normal")
        self.form.minsize(250,100)
        self.form.maxsize(250,100)
        self.name_label = tk.Label(text="İsim: ", font="Arial 10 bold")
        self.name_label.place(x=10,y=15)
        self.name_entry = tk.Entry(width="30")
        self.name_entry.place(x=55, y=15)
        self.button = tk.Button(text="Kaydet!", width="10", height="2", command=self.ekle)
        self.button.place(x=95, y= 50)
        self.form.mainloop()
    def ekle(self):
        self.yerleştir = self.name_entry.get()
        new.execute("INSERT INTO Kullanıcı(İsim) VALUES('{}')".format(self.yerleştir))

my_form = MyView()

Tabiki daha iyisi yazılabilir.

Yok hocam sizin de söylediğiniz gibi tek amaç bir fonksiyon işlevi görmek :slight_smile: Ancak maalesef ben henüz Nesne Tabanlı Programlama’yı tam olarak anlayamadığım için, elimden geldiğince saçma sapan örnekler deniyorum. Yani bunu tam olarak da nasıl anlayabilirim henüz anlamış da değilim.

Neyi nesne tabanlı mantığa göre kodlamamız gerekiyor mesela?

Bu arada, cevabınız için çok teşekkür ediyorum. Bununla beraber sınıf adı ile çağırmak da işe yarıyor. Yani: MyData.new_name() gibi çağırmaktan bahsediyorum.

1 Beğeni

Hayir, sacma degil. Bu ufak bir program oldugu icin, tersi de degil.

MyData’nin calismaya hazir bir ornegi (instance) MyView’a paslanmis olmali. MyView yeri geldiginde bu ornek uzerindeki fonksiyonlari cagirabilir.

Yazdigin kodda model yok. (Name diye bir class olmasi lazim)
View MyView.
Controller da yok.

mainloop ile ilgili yazdigim seyleri uygulamamissin. Daha constructor-method ayrimi bile yok. M/V/C ayrimi icin cok erken.

1 Beğeni

Verdiğiniz örnekteki kod yerine bu şekilde kodlayabilirsiniz.

mport tkinter as tk
from tkinter import ttk
 
class windows(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        # Adding a title to the window
        self.wm_title("Test Application")
 
        # creating a frame and assigning it to container
        container = tk.Frame(self, height=400, width=600)
        # specifying the region where the frame is packed in root
        container.pack(side="top", fill="both", expand=True)
 
        # configuring the location of the container using grid
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
 
        # We will now create a dictionary of frames
        self.frames = {}
        # we'll create the frames themselves later but let's add the components to the dictionary.
        for F in (MainPage, SidePage, CompletionScreen):
            frame = F(container, self)
 
            # the windows class acts as the root window for the frames.
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
 
        # Using a method to switch frames
        self.show_frame(MainPage)
1 Beğeni

@aib ,
Şimdi, öncelikle söylediğiniz gibi ufak bir programı yazarken OOP kullanmak, bana da pek mantıklı gelmemeye başladı. Her ne kadar başlangıçta anlamak için bunu yapmaya çabalasam da.

Evet, MyData’nın bir örneğini alamadığım için, nesne üzerinden MyData classının methodlarına ulaşamıyorum bu da beni uğraştırıyor.

Açıkçası databaseyi ayrı bir class halinde çalışmanın avantajı nedir? Database classını örnekleme işlemi nasıl yapılıyor? Yani, Data classındaki her fonksiyonu bir örnek üzerinden mi çalıştırmak daha doğru olur bilmek isterim hocam? (Gerçi örneklemeden bir avantajı da var mı bilemedim ama bazıları hiç örneklemeden de class olabilir diyordu galiba.

Örneğin, burada OOP kullanmaya çalışarak Database ve arayüz kısımlarını ayrı bir class olarak çalıştım. Ama databaseye personel ekleme yapacak fonksiyonları nerede tanımlamam gerekti bilemedim. Ben şu şekilde yapabildim. Vakit bulur da incelerseniz çok sevinirim: May 11 10:05 PM - Codeshare

MVC konusunda da doğrusunuz hocam. Acemilikle hareket edip aceleci davranıyorum. Sanırım yine siz söylemiştiniz, bir programı kodlayabileceğim her türlü şekilde kodlamaya çalışıyorum. Son olarak, ola ki söylediklerinizi anlayamazsam beni yanlış anlamayın hocam :slight_smile: Yani bilgi seviyem başlangıç durumunda olduğu için, bazen kullandığınız terimleri dahi anlayamadığım oluyor.

@Wormer_King hocam, yazdığınız kodda bazı noktaları anlayamadım. Yine aynı mantıkta Tk sınıfının bir subclassı olarak çalışıyoruz ve sınıfı örneklediğimiz zaman otomatikman çalışacak init fonksiyonunu düzenliyoruz.

Yalnız, init fonksiyonu içindeki container gibi değişkenlerin başında self olmaması normal bir şey midir? Çünkü ben sürekli self kullanarak, nesneye işaret ediyorum da?
Ayrıca, şu anda tkinter üzerine dersler izliyorum. Sanıyorum kavradıkça diğer kısımları da anlayabileceğim.

Cevap verip ilgi gösterdiğiniz için çok teşekkür ediyorum.

Ayni kodu iki farkli sekilde yazip avantajlari/dezavantajlari birinci elden gorebilirsiniz. Goremezseniz kod uzerinden tekrar sorun.

Ortada ornek yani obje yoksa OOP yapmiyorsun, class’i namespace olarak kullaniyorsun demektir.

Felsefe olacak ama: terimleri bilmek konuyu bilmek zaten, galiba.

Kodu buraya ``` arasina yazarsaniz hem mesajda kod oldugunu okumaya baslamadan once gorup ona gore davranabilirim, hem de koddan dogrudan alinti yapabilirim.

    def personel_add(self):
        self.vt = sql.connect("son_veri.db")
        self.cur = self.vt.cursor()
        name = program.name_entry.get()
        age = program.age_entry.get()
        mail = program.mail_entry.get()

Burada datanin parametreyle gelmemesi temel prosedurel (fonksiyon kullanan) programlama eksigine dalalet. OOP’yi dusunmeden bile, once, bu programi fonksiyonlar kullanarak yazman lazim.

1 Beğeni

Hocam, zaman ayırıp cevap verdiğiniz için çok teşekkür ediyorum. Yorumunuzu inceleyip, çalışacağım inşallah.