Bütün Buton Objelerini Tek Bir Fonksiyon Altında Toplayıp O Fonksiyonun da Altında Ayrı Ayrı İşlevlendirmek

Biliyorum bu başlık çok yetersiz oldu.

Kodlar :

from PyQt5.QtWidgets import *
import sys
import math
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import calc_ui

class Window(QMainWindow, calc_ui.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.menubar()
        self.one_to_nine_table = [
            [self.one,self.two,self.three],    #    row_one
            [self.four,self.five,self.six],    #    row_two
            [self.seven,self.eight,self.nine]  #    row_three
        ]
        
        button_list = [
            # numbers
            self.one_to_nine_table[0][0], self.one_to_nine_table[0][1], self.one_to_nine_table[0][2],
            self.one_to_nine_table[1][0], self.one_to_nine_table[1][1], self.one_to_nine_table[1][2],
            self.one_to_nine_table[2][0], self.one_to_nine_table[2][1], self.one_to_nine_table[2][2],
            self.zero,
            
            #others
            self.equals, self.comma, self.left_paranthesis, self.right_paranthesis,
            self.addition, self.extraction_process, self.multiplication, self.division,
            self.exp_num, self.delete_2, self.show_exp_num, self.sqrt
        ]
        
        for i in button_list:
            i.clicked.connect(
                # funct
            )
        
        
        
        
        
        
        
        
        
        
        

    def menubar(self):
        
        # Style (QMenu)
        self.menuBar.setStyleSheet("QMenuBar {\n"
"    background-color: #DCDCDC;\n"
"    color: black;\n"
"}\n"
"\n"
"")
        
      # triggers
      
        # Styles
        self.actionYellow.triggered.connect(self.yellow_font)
        self.actionGreen.triggered.connect(self.green_font)
        self.actionRed.triggered.connect(self.red_font)
        self.actionWhite.triggered.connect(self.white_font)
        
        # Mods
        self.actionCalculator.triggered.connect(self.show_calculator)
        self.actionOther.triggered.connect(self.show_other)
        self.actionMiniWindow.triggered.connect(self.miniWindow)
      
      
      
        
    def get_yellow_font(self,bool):
            
            if bool == True:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: yellow;\n"
                "    font-size:50px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "")
        
            elif bool == False:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: yellow;\n"
                "    font-size:30px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "")
                

    def get_green_font(self,bool):
            
            if bool == True:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: #00ff00;\n"
                "    font-size:50px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "")
        
            elif bool == False:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: #00ff00;\n"
                "    font-size:30px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "")
                
                
    def get_red_font(self,bool):
            if bool == True:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: #ff0000;\n"
                "    font-size:50px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "")
        
            elif bool == False:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: #ff0000;\n"
                "    font-size:30px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "") 
                
                
    def get_white_font(self,bool):
             if bool == True:
                     
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: white;\n"
                "    font-size:50px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "")
        
             elif bool == False:
                return ("QPushButton {\n"
                "    background-color: #303030;\n"
                "    color: white;\n"
                "    font-size:30px;\n"
                "}\n"
                "\n"
                "QPushButton:hover {\n"
                "    background-color: #4d4d4d;\n"
                "}\n"
                "\n"
                "") 
            
                   
                
            
    
        
        
        
    def yellow_font(self):
        
        self.one_to_nine_table[0][0].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[0][1].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[0][2].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[1][0].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[1][1].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[1][2].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[2][0].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[2][1].setStyleSheet(self.get_yellow_font(True))
        self.one_to_nine_table[2][2].setStyleSheet(self.get_yellow_font(True))
        self.zero.setStyleSheet(self.get_yellow_font(True))

        self.equals.setStyleSheet(self.get_yellow_font(True))
        self.delete_2.setStyleSheet(self.get_yellow_font(False))
        self.show_exp_num.setStyleSheet(self.get_yellow_font(False))
        self.sqrt.setStyleSheet(self.get_yellow_font(False))
        self.clean.setStyleSheet(self.get_yellow_font(True))
        self.addition.setStyleSheet(self.get_yellow_font(False))
        self.extraction_process.setStyleSheet(self.get_yellow_font(False))
        self.multiplication.setStyleSheet(self.get_yellow_font(False))
        self.division.setStyleSheet(self.get_yellow_font(False))
        self.exp_num.setStyleSheet(self.get_yellow_font(False))
        self.left_paranthesis.setStyleSheet(self.get_yellow_font(True))
        self.right_paranthesis.setStyleSheet(self.get_yellow_font(True))
        self.comma.setStyleSheet(self.get_yellow_font(False))
        self.clean.setStyleSheet(self.get_yellow_font(True))
        
        

    def green_font(self):
            
        self.one_to_nine_table[0][0].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[0][1].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[0][2].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[1][0].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[1][1].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[1][2].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[2][0].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[2][1].setStyleSheet(self.get_green_font(True))
        self.one_to_nine_table[2][2].setStyleSheet(self.get_green_font(True))
        self.zero.setStyleSheet(self.get_green_font(True))

        self.equals.setStyleSheet(self.get_green_font(True))
        self.delete_2.setStyleSheet(self.get_green_font(False))
        self.show_exp_num.setStyleSheet(self.get_green_font(False))
        self.sqrt.setStyleSheet(self.get_green_font(False))
        self.clean.setStyleSheet(self.get_green_font(True))
        self.addition.setStyleSheet(self.get_green_font(False))
        self.extraction_process.setStyleSheet(self.get_green_font(False))
        self.multiplication.setStyleSheet(self.get_green_font(False))
        self.division.setStyleSheet(self.get_green_font(False))
        self.exp_num.setStyleSheet(self.get_green_font(False))
        self.left_paranthesis.setStyleSheet(self.get_green_font(True))
        self.right_paranthesis.setStyleSheet(self.get_green_font(True))
        self.comma.setStyleSheet(self.get_green_font(False))
        self.clean.setStyleSheet(self.get_green_font(True))
    

    def red_font(self):

        self.one_to_nine_table[0][0].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[0][1].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[0][2].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[1][0].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[1][1].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[1][2].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[2][0].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[2][1].setStyleSheet(self.get_red_font(True))
        self.one_to_nine_table[2][2].setStyleSheet(self.get_red_font(True))
        self.zero.setStyleSheet(self.get_red_font(True))

        self.equals.setStyleSheet(self.get_red_font(True))
        self.delete_2.setStyleSheet(self.get_red_font(False))
        self.show_exp_num.setStyleSheet(self.get_red_font(False))
        self.sqrt.setStyleSheet(self.get_red_font(False))
        self.clean.setStyleSheet(self.get_red_font(True))
        self.addition.setStyleSheet(self.get_red_font(False))
        self.extraction_process.setStyleSheet(self.get_red_font(False))
        self.multiplication.setStyleSheet(self.get_red_font(False))
        self.division.setStyleSheet(self.get_red_font(False))
        self.exp_num.setStyleSheet(self.get_red_font(False))
        self.left_paranthesis.setStyleSheet(self.get_red_font(True))
        self.right_paranthesis.setStyleSheet(self.get_red_font(True))
        self.comma.setStyleSheet(self.get_red_font(False))
        self.clean.setStyleSheet(self.get_red_font(True))
        

    def white_font(self):
            
        self.one_to_nine_table[0][0].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[0][1].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[0][2].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[1][0].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[1][1].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[1][2].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[2][0].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[2][1].setStyleSheet(self.get_white_font(True))
        self.one_to_nine_table[2][2].setStyleSheet(self.get_white_font(True))
        self.zero.setStyleSheet(self.get_white_font(True))

        self.equals.setStyleSheet(self.get_white_font(True))
        self.delete_2.setStyleSheet(self.get_white_font(False))
        self.show_exp_num.setStyleSheet(self.get_white_font(False))
        self.sqrt.setStyleSheet(self.get_white_font(False))
        self.clean.setStyleSheet(self.get_white_font(True))
        self.addition.setStyleSheet(self.get_white_font(False))
        self.extraction_process.setStyleSheet(self.get_white_font(False))
        self.multiplication.setStyleSheet(self.get_white_font(False))
        self.division.setStyleSheet(self.get_white_font(False))
        self.exp_num.setStyleSheet(self.get_white_font(False))
        self.left_paranthesis.setStyleSheet(self.get_white_font(True))
        self.right_paranthesis.setStyleSheet(self.get_white_font(True))
        self.comma.setStyleSheet(self.get_white_font(False))
        self.clean.setStyleSheet(self.get_white_font(True))
        
        
    

            
    
    def show_calculator(self):
        pass 
    
    def show_other(self):
        pass
    
    def miniWindow(self):
        pass
        
        
        

    
       
app = QApplication(sys.argv)
window = Window()
window.setWindowTitle("Calculator")
window.show()
sys.exit(app.exec_())

Kodların Şu satırlarında :

 button_list = [
            # numbers
            self.one_to_nine_table[0][0], self.one_to_nine_table[0][1], self.one_to_nine_table[0][2],
            self.one_to_nine_table[1][0], self.one_to_nine_table[1][1], self.one_to_nine_table[1][2],
            self.one_to_nine_table[2][0], self.one_to_nine_table[2][1], self.one_to_nine_table[2][2],
            self.zero,
            
            #others
            self.equals, self.comma, self.left_paranthesis, self.right_paranthesis,
            self.addition, self.extraction_process, self.multiplication, self.division,
            self.exp_num, self.delete_2, self.show_exp_num, self.sqrt
        ]
        
        for i in button_list:
            i.clicked.connect(
                # funct
            )

gördüğünüz gibi butonları tek bir fonksiyona bağlamaya çalışmışım. Ben bütün butonları tek bir fonksiyona bağlayacağım ancak hepsinin farklı bir işlevi olacak.
Yani hepsi “a” adında bir fonksiyonda toplanıyorsa, biri “b” biri “c” işlevini gerçekleştirecek.
Yanılmıyorsam iç içe fonksiyonlar yazmamız gerekecek ama nasıl bir şey yazmalıyım bir türlü bulamadım. Yardımcı olur musunuz ?

Aslında bütün butonları tek tek

self.btn.clicked.connect(funct_one)
self.btn.clicked.connect(funct_two)
.....

def func_one(self):
     .....

def func_two(self):
    .....

bu şekilde yazabilirdim ancak bu şekilde yazmak karmaşık olurdu ve okunaklığı azaltırdı bence.
Bu yüzden “Bütün Buton Objelerini Tek Bir Fonksiyon Altında Toplayıp O Fonksiyonun da Altında Ayrı Ayrı İşlevlendirmek” istedim. Bunu nasıl yapacağım konusuda sizden yardım istiyorum.
Eğer söylediğim yöntemden daha güzel bir fikriniz varsa belirtebilirsiniz.

Burayı açmanız lazım.

Benzer bir konu açılmıştı:

1 Beğeni

Buradaki mantığı tam anlayamadığım için kendim başka bir yöntem düşündüm.

button_list = [
            # numbers
            self.one_to_nine_table[0][0], self.one_to_nine_table[0][1], self.one_to_nine_table[0][2],
            self.one_to_nine_table[1][0], self.one_to_nine_table[1][1], self.one_to_nine_table[1][2],
            self.one_to_nine_table[2][0], self.one_to_nine_table[2][1], self.one_to_nine_table[2][2],
            self.zero,
            
            #others
            self.equals, self.comma, self.left_paranthesis, self.right_paranthesis,
            self.addition, self.extraction_process, self.multiplication, self.division,
            self.exp_num, self.delete_2, self.show_exp_num, self.sqrt
        ]
        
        for i in button_list:
            i.clicked.connect(
                self.buttonFunctions
            )

def buttonFunctions(self):
        if self.one_to_nine_table[0][0].clicked:
            print("One Numbered Btn Has Worked")
            
        if self.one_to_nine_table[0][1].clicked:
            print("Two Numbered Btn Has Worked")
            
        if self.one_to_nine_table[0][2].clicked:
            print("Three Numbered Btn Has Worked")

Bu yazdığım kodlara göre, “1” butonuna bastığımda yalnızca “One Numbered Btn Has Worked” yazdırması lazımdı ancak nedense üç texti birden bastırıyor. Diğer koşullar sağlanmamasına rağmen neden üçünü birden bastırdı ? Aynı şekilde “2” ve “3” butonlarına basmak da bu üç textin birden bastırılmasına sebep oluyor.
İf’ten sonra elif blokları kullanmayı denediğimde de bu sefer üç butona da basmak yalnızca “one numbered btn has worked” textini bastırmaya yaradı. Niye böyle bir sonuç alıyorum ?

Üç koşuldan yalnızca biri sağlanıyor, yalnızca “1” yazan butona tıklıyorum. Ancak diğer 2 koşul da sağlanmış olarak çalışıyor ve test etmek amaçlı yazdığım 3 text de aynı anda terminale bastırılıyor. Böyle olmaması lazımdı :confused:

Her bir buton için ayrı ayrı fonksiyona bağlamayı neden istemiyorsunuz ki?

Ben mi yanlış düşünüyorum acaba?

Tek bir fonksiyonda toplayabilirsem daha düzenli olacağını düşünüyorum.
Zaten bir sürü fonksiyon olacağı için karmaşıklığı engellemek de istiyorum

1 Beğeni

pyqt5 bildiğimden değil ama buttonFunctions fonksiyonun başına print(self.one_to_nine_table[0][0].clicked) yazabilir misiniz (debugging!) clicked özniteliği büyük ihtimalle tıklanıp tıklanılmadığını gösteren, True veya False değerlerini alan bir ifade değil. Zaten şurada da öyle değilmiş gibi kullanmışsınız

Dolayısıyla .clicked ile boolean bağlamında her zaman True şeklinde değerlenen bir objeye sahipsiniz gibi. Yapmanız gereken ise hangi butona tıklanıp tıklanılmadığını gösterebilecek asıl kodu bulmak (internette çıkıyor bu galiba)

1 Beğeni

Sonuç yine aynı. Sadece bastırılacak şey tanımlanmadığı için başka bir yazı bastırılıyor.

Ne demek istediğinizi anlamadım ama .clicked yazdığınızda True veya False dönmüyor, PYQT_SIGNALimsi bir obje dönüyormuş. Bunu da alıp if'e koyarsak hep True olur çünkü (özellikle __bool__ veya __len__in üzerine yazmadıysa) bir nesne, boolean bağlamında True olarak değerlendirilir.

Mesela

>>> class Car:
...     pass
...
>>> car = Car()
>>> if car:
...     print(12)
...
12
>>>

Yani sizin butona basılıp basılmadığını tespit etmek için doğru koda ihtiyacınız var, QButtonGroup yardımıyla olabilir

1 Beğeni

galiba böyle bir şeyden bahsediyorsunuz.

from tkinter import *
root=Tk()

yazi = StringVar()
Entry(textvariable=yazi).pack()
def buton(side,text,command=None):
    say= Button(text=text,command=command)
    say.pack(side=side)
    return say



for sayi in ("123456789"):
    buton(LEFT, sayi, lambda say=yazi, x=sayi: say.set(say.get() + x))


root.mainloop()

(umarım doğru biçimde göndermişimdir kodları, daha siteye alışık değilim)

"One Numbered Btn Has Worked" yazdırması gerektiğini nereden çıkardınız? @Then_Shiffman anlatmış zaten ama tekrarlayacağım, böyle bir durum ile karşılaştığınızda kütüphanenin dökümanlarına bakmanız ve debugging yapmanız lazım. Kodun arasına bir tane print sıkıştırmak, sizin için de buraya yeni bir gönderi atmaktan daha kolay olur.

Tekrar eden kodları niçin bir fonksiyon haline getiriyorsak, döngüleri niçin kullanıyorsak o yüzden. Burada da tekrar eden fonksiyonlar var, Python dili bize bu fonksiyonları tek seferde oluşturacak kodu yazmak için araçlar sağlıyor.

Şu örneği inceleyin:

import sys
from PySide2.QtWidgets import*
from PySide2.QtCore import*
from PySide2.QtGui import*



class Calculator(QMainWindow):
	def __init__(self):
		super().__init__()
		self.initUi()

	def initUi(self):
		self.resize(400, 300)
		self.setWindowTitle("Calculator")
		self.widget = QWidget()
		self.result = QLineEdit()

		self.layout = QVBoxLayout()
		self.buttonLayout = QGridLayout()

		buttons = {
				'7': (0, 0),
				'8': (0, 1),
				'9': (0, 2),
				'/': (0, 3),
				'C': (0, 4),
				'4': (1, 0),
				'5': (1, 1),
				'6': (1, 2),
				'*': (1, 3),
				'(': (1, 4),
				'1': (2, 0),
				'2': (2, 1),
				'3': (2, 2),
				'-': (2, 3),
				')': (2, 4),
				'0': (3, 0),
				'00': (3, 1),
				'.': (3, 2),
				'+': (3, 3),
				'=': (3, 4),
				}
		self.buttonGroup = QButtonGroup()
		for text, pos in buttons.items():
			button = QPushButton(text)
			self.buttonGroup.addButton(button)
			self.buttonLayout.addWidget(button, pos[0], pos[1])

		self.buttonGroup.buttonClicked.connect(self.button_clicked)

		self.layout.addWidget(self.result)
		self.layout.addLayout(self.buttonLayout)
		self.widget.setLayout(self.layout)
		self.setCentralWidget(self.widget)

	def button_clicked(self, button):
		self.result.setText(self.result.text()+button.text())

if __name__ == "__main__":
	app = QApplication(sys.argv)
	window = Calculator()
	window.show()
	sys.exit(app.exec_())
1 Beğeni