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
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
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
Yok hocam sizin de söylediğiniz gibi tek amaç bir fonksiyon işlevi görmek 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.
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)
@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 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.