HiraMana: hiragana öğretici uygulama :)

Arkadaşlar canım sıkıldığı için ve hiragana(japonyada kullanılan bir hece sistemi) da kendimi geliştirmek adına yazdığım bir uygulama ayrıca ses desteği var, her heceyi sesli bir şekilde öğretiyor ama istenilirse romaji yani bizim kullandığım alfabedeki hallerini hecelerin widgetlarının üstüne mousenizi getirirseniz görebilirsiniz

gerekli modüller: playsound, tkinter.ttk, tkinter.tix (tkinter ile alakalılar default gelmiş olabilir)
hiramana1 hiramana2 hiramana3 hiramana4

source:

import os
from tkinter import *
from tkinter.tix import *
from tkinter import ttk, font
from playsound import playsound
class HiraMana:
	normal     = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん"
	dakuten    = "がぎぐげござじずぜぞだぢづでどばびぶべぼ"
	handakuten = "ぱぴぷぺぽ"
	romaji =    ['a',  'i', 'u','e','o',
				 'ka', 'ki','ku',   'ke',
				 'ko', 'sa','shi',  'su',
				 'se', 'so','ta',   'chi',
				 'tsu','te','to',   'na',
				 'ni', 'nu','ne',   'no',
				 'ha', 'hi','fu',   'he',
				 'ho', 'ma','mi',   'mu',
				 'me', 'mo','ya',   'yu',
				 'yo', 'ra','ri',   'ru',
				 're', 'ro','wa',   'wo',
				 'n',  'ga','gi',   'gu',
				 'ge', 'go','za',   'ji',
				 'zu', 'ze','zo',   'da',
				 'ji', 'zu','de',   'do',
				 'ba', 'bi','bu',   'be',
				 'bo', 'pa','pi',   'pu',
				 'pe', 'po']
	hiraganaMap = dict(zip(normal+dakuten+handakuten, romaji))
	romajiMap   = dict(zip(romaji, normal+dakuten+handakuten))
	def __init__(self, ):
		self.root = Tk()
		self.root.title("HiraMana")
		self.root.resizable(False, False)
		self._FONT = font.Font(family='Helvetica', size=22, weight='bold')
		self.widgets = {"Normal":    {"tabframe": None, "bottomframe": None, "chartbuttons": []},
						"Dakuten":   {"tabframe": None, "bottomframe": None, "chartbuttons": []},
						"Handakuten":{"tabframe": None, "bottomframe": None, "chartbuttons": []}}
		self.tabControl = ttk.Notebook(self.root)
		self.balloon = Balloon(self.root,bg="white", title="Romaji")
		self.balloon.subwidget('message')['fg'] = "red"
		self.balloon.subwidget('message')['font'] = self._FONT
		for sub in self.balloon.subwidgets_all(): # Change background of balloon widget
			sub.config(bg='light grey')
		self.__initWidgets()

	def __initWidgets(self):
			
		def normalForm():
			self.widgets["Normal"]["tabframe"]    = Frame(self.root)
			self.widgets["Normal"]["bottomframe"] = Frame(self.widgets["Normal"]["tabframe"], bg="gray")
			for hc in self.normal:
				path = os.path.join("sounds",f"{self.hiraganaMap[hc]}.mp3") # Safe way of paths
				hiraButton = Button(self.widgets["Normal"]["bottomframe"])
				hiraButton["text"] = hc
				hiraButton["font"] = self._FONT
				hiraButton["command"] = lambda path=path:playsound(path, False)# path=path->lambda looks up the variable name at the time the function is called 
				self.balloon.bind_widget(hiraButton, balloonmsg=self.hiraganaMap[hc])
				self.widgets["Normal"]["chartbuttons"].append(hiraButton)

		def dakutenForm():
			self.widgets["Dakuten"]["tabframe"]    = Frame(self.root)
			self.widgets["Dakuten"]["bottomframe"] = Frame(self.widgets["Dakuten"]["tabframe"], bg="gray")
			for hc in self.dakuten:
				path = os.path.join("sounds",f"{self.hiraganaMap[hc]}.mp3") # Safe way of paths
				hiraButton = Button(self.widgets["Dakuten"]["bottomframe"])
				hiraButton["text"] = hc
				hiraButton["font"] = self._FONT
				hiraButton["command"] = lambda path=path:playsound(path, False)# path=path->lambda looks up the variable name at the time the function is called 
				self.balloon.bind_widget(hiraButton, balloonmsg=self.hiraganaMap[hc])
				self.widgets["Dakuten"]["chartbuttons"].append(hiraButton)
		def handakutenForm():
			self.widgets["Handakuten"]["tabframe"]    = Frame(self.root)
			self.widgets["Handakuten"]["bottomframe"] = Frame(self.widgets["Handakuten"]["tabframe"], bg="gray")
			for hc in self.handakuten:
				path = os.path.join("sounds",f"{self.hiraganaMap[hc]}.mp3") # Safe way of paths
				hiraButton = Button(self.widgets["Handakuten"]["bottomframe"])
				hiraButton["text"] = hc
				hiraButton["font"] = self._FONT
				hiraButton["command"] = lambda path=path:playsound(path, False)# path=path->lambda looks up the variable name at the time the function is called 
				self.balloon.bind_widget(hiraButton, balloonmsg=self.hiraganaMap[hc])
				self.widgets["Handakuten"]["chartbuttons"].append(hiraButton)
		normalForm()
		dakutenForm()
		handakutenForm()

	def loop(self):
		def drawChart(widgets, chart):
			idx = 0
			for y in range(len(chart)):
				for x in range(chart[y]):
					widgets[idx].grid(row = y, column = x)
					idx += 1			
		def normalForm():
			self.widgets["Normal"]["bottomframe"].grid(row=1, column=0, columnspan=3, padx=10, pady=10, sticky=E+W+N+S)
			self.widgets["Normal"]["tabframe"].columnconfigure(0, weight=1)
			self.widgets["Normal"]["tabframe"].rowconfigure(1, weight=1)
			drawChart(self.widgets["Normal"]["chartbuttons"], [10,10,10,10,6])

		def dakutenForm():
			self.widgets["Dakuten"]["bottomframe"].grid(row=1, column=0, columnspan=3, padx=10, pady=10, sticky=E+W+N+S)
			self.widgets["Dakuten"]["tabframe"].columnconfigure(0, weight=1)
			self.widgets["Dakuten"]["tabframe"].rowconfigure(1, weight=1)
			drawChart(self.widgets["Dakuten"]["chartbuttons"], [10,10])

		def handakutenForm():

			self.widgets["Handakuten"]["bottomframe"].grid(row=1, column=0, columnspan=3, padx=10, pady=10, sticky=E+W+N+S)
			self.widgets["Handakuten"]["tabframe"].columnconfigure(0, weight=1)
			self.widgets["Handakuten"]["tabframe"].rowconfigure(1, weight=1)
			drawChart(self.widgets["Handakuten"]["chartbuttons"], [5])

		normalForm()
		dakutenForm()
		handakutenForm()
		self.tabControl.add(self.widgets["Normal"]["tabframe"],    text= "Normal Form")
		self.tabControl.add(self.widgets["Dakuten"]["tabframe"],   text= "Dakuten Form")
		self.tabControl.add(self.widgets["Handakuten"]["tabframe"],text= "Handakuten Form")
		self.tabControl.pack(expand = 1, fill ="both") 
		self.root.mainloop()

if __name__ == '__main__':
	hira = HiraMana()
	hira.loop()

klasor ve dosya hiyerarşisi:
main.py → source
sounds → dir
sesleri nasıl paylaşabileceğim hakkında fikir verirseniz sevinirim .
:laughing:

5 Beğeni

Hecelerin baslangiclarina ve cekirdeklerine gore ayirirsan harfleri bulmasi da, ogrenmesi de daha kolay olur. Bunun alfabetik bir dizimini Wikipedia sayfasinda bulabilirsin.

Dakuten/Handakuten formlarinda ise aksanli harflerin orijinal harflerle ayni yerlere denk gelmelerini tavsiye ediyorum.

Boylelikle aslinda uc boyutlu bir tablo yapmis oluyorsun. Su haliyle tek boyutlu.

1 Beğeni

bunu tkinter ile nasıl bir şekilde yapabilirim ki mobilde olsa bastırıp gelen seçeneklerden seçersinde burda da mı aynı şeyi yapsam

burayı tam anlayamadım çekirdekleri derken ne demek istediniz?
:confused:

@aib düzenledim a,i,u,e,o sıralamasıyla
aiueo
ka ki ku ke ko
sa si su se so

Olabilir

Eski tasarimi da koruyabilirsin. Harfleri (harf butonlarini?) sol uste sikistirmak yerine aksansiz hallerinin olduklari yerlere koyabilirsin demek istemistim.

Edit: yukardaki gibi sol ustte olacagina asagidaki gibi ikinci satirin ilk sutununda olsun.

https://tr.qaz.wiki/wiki/Syllable#Nucleus

super!​

1 Beğeni

normalde böyle basit projeleri githuba koyma huyum yoktur ama genede bakmak isteyenler için :D.

Edin.

Kimseye hic bir zarari yok, sana da sadece faydasi olabilir.

Bir noktada CV yerine/yaninda kullanmaya baslarsin en kotu.

3 Beğeni

:confused:
tavsiyeniz için saolun hocam dikkat ederim
:slight_smile: