MySQL'de saklanan Ülke, İl, İlçe bilgilerini PyQT5 ile QComboBox'larda yukarıdan aşağı süzmek

python

#1

Herkese selamlar,

Python3 kullanıyorum ve oldukça yeniyim. Şirketim için firma bilgilerini tuttuğum bir programa ihtiyacım var. Görseldeki ekranı PySide2 kullanarak hazırladım.

Bir kaç gündür üzerinde uğraştığım bir konu var ve çözemiyorum. Uzun Stackoverflow aramalarında da doğru yanıtı bulamadım. Firmaları kayıt altına alırken önce ülkeyi seçtirmek ve ülkeye göre şehri seçtirmek ve şehre göre ilçeyi seçtirmek istiyorum ancak bir türlü çözemedim. :frowning:

Database olarak MySQL kullanıyorum.

Veritabanı olarak https://github.com/ByNeo/CountriesDBScripts/tree/master/Scripts/MySQL bunu kullandım.

Bir fikir verebilecek biri varsa çok yardımcı olur. Şimdiden teşekkür ederim.


#2

Anlık olarak combobox itemlerinin yenilenmesini mi istiyorsunuz? Örneğin Türkiye seçildiği zaman şehir combox’ında Türkiye’de ki şehirler mi olacak?


#3

Aynen üstat. :slight_smile:


#4

Ben veri tabanı kullanmadım ama aynı mantık sadece veriler veri tabanından çekilecek.Yapabildiğim kadar açıklama ekledim.

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_Form(object):

	def setupUi(self, Form):
		Form.setObjectName("Form")
		Form.resize(400, 300)

		self.comboBox = QtWidgets.QComboBox(Form) #Ülkeler combobox
		self.comboBox.setGeometry(QtCore.QRect(50, 40, 191, 22))
		self.comboBox.setObjectName("comboBox")
		ulkeler = ["Türkiye","Almanya","İngiltere"] #Burada ülkerlerin veritabanından çekildiğini varsayıyorum
		self.comboBox.addItems(ulkeler) #çekilen ülkeler comboxa eklendi
		self.comboBox.currentIndexChanged.connect(self.sec) #comboxta herhangi bir iteme tıklandığında sec methodu çalışacak

		self.comboBox_2 = QtWidgets.QComboBox(Form) #sehirler combobox
		self.comboBox_2.setGeometry(QtCore.QRect(50, 90, 191, 22))
		self.comboBox_2.setObjectName("comboBox_2")

		self.retranslateUi(Form)
		QtCore.QMetaObject.connectSlotsByName(Form)

	def sec(self):
		secilen = self.comboBox.currentText() # 'secilen' değişkenine comboboxta şuan seçili olan item'im text'ini atıyoruz
		sehirler = {"Türkiye":["Ankara","İstanbul"],
		"Almanya":["Berlin","Köln"],
		"İngiltere":["Londra","Manchester"]} #veritabanım olmadığı için burada böyle bir yol izledim ama burada bir sql sorgusu çalıştırılarak veri tabanından gerekli veriler çekilerbilir. Örneğin:
		# SELECT * FROM tablo where ulkeadi = secilen 

		self.comboBox_2.clear()#burada sehirlerin yazılacağı comboox temizleniyor
		self.comboBox_2.addItems(sehirler[secilen]) # sehirler combobox'ına istenilen veriler ekleniyor

	def retranslateUi(self, Form):
		_translate = QtCore.QCoreApplication.translate
		Form.setWindowTitle(_translate("Form", "Form"))

if __name__ == '__main__':
	app = QtWidgets.QApplication(sys.argv)
	form = QtWidgets.QWidget()
	ui = Ui_Form()
	ui.setupUi(form)
	form.show()
	app.exec_()

#5

Merhaba üstat, ana mantığı anladım. Ben şimdi bunun üzerine geliştiririm. Son halini de sizinle paylaşıyor olurum. Çok teşekkür ederim.


#6

Önemli değil. Sizin için kilit nokta

currentIndexChanged.connect()

methodu olacaktır.


#7

Üstat merhaba,
Kodların son şekli şöyle oldu:

SQL.py

def combo_binding(column, table, id_column, id_value):
    conn, cursor = connect(read_db_config(sql_config_file))
    query = """SELECT {} FROM {} WHERE {} = {}""".format(column, table, id_column, id_value)
    temp_list = []

    try:
        cursor.execute(query)
        row = cursor.fetchall()

        for i in range(len(row)):
            temp_list.append(row[i][0])

        del row
        return temp_list

    except Error as e:
        print(e)

    finally:
        cursor.close()
        conn.close()
        del conn, cursor, query

main.py

    class NewCompany():
    ....
    def current_informations(self)
        country_lbl = QtWidgets.QLabel(Lang.company["country"][lang])
        grid_layout.addWidget(country_lbl, 1, 0, 1, 1)

        self.country_combo = QtWidgets.QComboBox(self)
        country_data = sql.select_all_by_column("CountryName", "country")
        self.country_combo.addItems(country_data)

        self.country_combo.currentIndexChanged.connect(self.select_country_combo)
        grid_layout.addWidget(self.country_combo, 1, 1, 1, 1)

        city_lbl = QtWidgets.QLabel(Lang.company["city"][lang], self)
        grid_layout.addWidget(city_lbl, 2, 0, 1, 1)
        self.city_combo = QtWidgets.QComboBox(self)
        self.city_combo.currentIndexChanged.connect(self.select_city_combo)
        grid_layout.addWidget(self.city_combo, 2, 1, 1, 1)

ve son olarak aynı class içerisinde tıklamayı yönettiğim her ComboBox için bir fonksiyon şöyle bir şey:

def select_country_combo(self, i):
    city_data = sql.combo_binding("CityName", "city", "CountryID", i+1)
    self.city_combo.clear()
    self.city_combo.addItems(city_data)

desteğin için tekrar teşekkür ederim üstat.