Pyqt5'te bir butona sağ tıklama özelliği nasıl ekleyebilirim?

Bu konu aslında çok başkaydı fakat aklıma gelen bir takım şeyler beni bir butona sağ tıklayabilmem gerektiğine sürükledi.

ss’te gördüğünüz üzere işaretlediğim bir buton var. Ben buna sağ tıklayabilmek istiyorum.
Sağ tıkladığım zaman da üzerindeki “**” işareti yerine “.” işareti yazacak.

Kısacası bu butonu sağ tıklanabilir hale getirmem lazım.

Kodlar aşağıdaki şekilde.

“**” butonu self.pushButton_16’ya bağlı. Bu da click17’ye bağlı.
İşimin olduğu kısım yani click17 kısmı için biraz boşluk açtım daha rahat izleyebilmek için.



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







class Pencere(QMainWindow, Hesap_Makinesi.HesapMakinesi):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.timer = QTimer()
        
        self.pushButton.clicked.connect(self.click1)
        self.pushButton_2.clicked.connect(self.click2)
        self.pushButton_3.clicked.connect(self.click3)
        self.pushButton_4.clicked.connect(self.click4)
        self.pushButton_5.clicked.connect(self.click5)
        self.pushButton_6.clicked.connect(self.click6)
        self.pushButton_7.clicked.connect(self.click7)
        self.pushButton_8.clicked.connect(self.click8)
        self.pushButton_9.clicked.connect(self.click9)
        self.pushButton_10.clicked.connect(self.click10)
        self.pushButton_12.clicked.connect(self.click11)
        self.pushButton_17.clicked.connect(self.click12)
        self.pushButton_14.clicked.connect(self.click13)
        self.pushButton_15.clicked.connect(self.click14)
        self.pushButton_11.clicked.connect(self.click15)
        self.pushButton_13.clicked.connect(self.click16)
        self.pushButton_16.clicked.connect(self.click17)
        
        
        
        
        

        self.pushButton_18.clicked.connect(self.clicklast)
        self.pushButton_19.clicked.connect(self.delete)
        self.pushButton_20.clicked.connect(self.karekok)
        
        
        
            

        
        
    

    def click1(self):
        
        yazi = self.lineEdit.text() + "1"
        self.lineEdit.setText(yazi)

    def click2(self):
        yazi = self.lineEdit.text() + "2"
        self.lineEdit.setText(yazi)

    def click3(self):
        yazi = self.lineEdit.text() + "3"
        self.lineEdit.setText(yazi)

    def click4(self):
        yazi = self.lineEdit.text() + "4"
        self.lineEdit.setText(yazi)

    def click5(self):
        yazi = self.lineEdit.text() + "5"
        self.lineEdit.setText(yazi)

    def click6(self):
        yazi = self.lineEdit.text() + "6"
        self.lineEdit.setText(yazi)

    def click7(self):
        yazi = self.lineEdit.text() + "7"
        self.lineEdit.setText(yazi)
    
    def click8(self):
        yazi = self.lineEdit.text() + "8"
        self.lineEdit.setText(yazi)

    def click9(self):
        yazi = self.lineEdit.text() + "9"
        self.lineEdit.setText(yazi)

    def click10(self):
        yazi = self.lineEdit.text() + "0"
        self.lineEdit.setText(yazi)

    def click11(self):
        self.lineEdit.clear()

    def click12(self):
        superscript = {
    "0": "\u2070",
    "1": "\u00b9",
    "2": "\u00b2",
    "3": "\u00b3",
    "4": "\u2074",
    "5": "\u2075",
    "6": "\u2076",
    "7": "\u2077",
    "8": "\u2078",
    "9": "\u2079"
}


        def get_superscript(x):
            return "".join(superscript[i] for i in str(x))
    

        def exponential_expression(x):
            count = 2
            while (y := math.log(x, count)) != int(y):
                count += 1
            return f"{count}{get_superscript(int(y))}"
        
        try:
            
            d = self.lineEdit.text()
            self.lineEdit.setText(exponential_expression(x=int(d)))
            
        except ValueError:
            self.lineEdit.setText("Geçersiz İşlem")
            
        
        self.label_2.setText(self.lineEdit.text())

        

    def click13(self):
        yazi = self.lineEdit.text() + "+"
        self.lineEdit.setText(yazi)

    def click14(self):
        yazi = self.lineEdit.text() + "-"
        self.lineEdit.setText(yazi)

    def click15(self):
        yazi = self.lineEdit.text() + "*"
        self.lineEdit.setText(yazi)

    def click16(self):
        yazi = self.lineEdit.text() + "/"
        self.lineEdit.setText(yazi)
        
        
        
        
        
        


    
   
    def click17(self):
        yazi = self.lineEdit.text() + "**"
        yaz2 = self.lineEdit.text() + "."
        
        
        self.timer.singleShot(0,lambda:self.lineEdit.setText(yazi))
        self.timer.stop()
        
        
        
        
        
        
        
        
        
        
       
    
        
        
        
        
        
            
        
        
            
        
        

    
        
        
        
        
        
        
        
        
        

    def delete(self):
        text = self.lineEdit.text()
        print(text[:len(text)-1]) 
        self.lineEdit.setText(text[:len(text)-1]) 
        
    def karekok(self):
        try:
            self.label_2.setText(self.lineEdit.text())
            txt = self.lineEdit.text()
            integer = int(txt)   
            rp = int(math.sqrt(abs(integer)))     
        
        
            ans = eval("{}*{}".format(str(rp),str(rp)))
        
            if str(ans) == self.label_2.text():
                self.lineEdit.setText(str(rp)+"^2") 
            
            
            else:         
                self.lineEdit.setText("Bu Sayının Karekökü Yoktur")
            
        except ValueError:
            self.lineEdit.setText("Geçersiz İşlem")
            

    
    def clicklast(self):
        # get the label text 
        equation = self.lineEdit.text() 
  
        try: 
            # getting the ans 
            ans = eval(equation) 
  
            # setting text to the label 
            self.lineEdit.setText(str(ans)) 
  
        except: 
            # setting text to the label 
            self.lineEdit.setText("Geçersiz İşlem")
            
        
        self.label_2.setText(self.lineEdit.text())
        
        
    
 
 
      
    
        
        
    
        
        
        


    
    
            

app = QApplication(sys.argv)
pencere = Pencere()
pencere.setWindowTitle("Hesap Makinesi")
pencere.show()
sys.exit(app.exec_())


C tuş butonunun enini daraltıp oraya bir nokta butonu koysanız ** tuşunuda tek tıklamalı tuş haline getirseniz görsel arayüz çokmu bozulur. Neden double click ile çözmeye uğraşıyorsunuz. Sonuçta Hesap Makinası uygulaması tabi bana düşmez ama öğrenmek içinse anlarım yoksa bana anlamsız geldi kusuruma bakmayın. Sadece sormak istedim.

Birde diyelim ki kullanıcı yanlışlıkla double click yerine tek tıkladı ve ekranda beliren sadece ** sayılarını silmek için hesap makinalarında olan yönü sola dönük ok gibi son ınputu silen bir işlevi olmalı programınızda diye düşünüyorum aksi takdirde kullanımda sıkıntı olur sanırım.

aynı şeyi inanın ben de düşündüm fakat yanlışlıkla ui dosyasını sildiğim için şuan geri de erişemiyorum dolayısıyla güncelleyemiyorum.
Eklemek istediğim 2 şey kalmıştı neyseki.
İlki bu “.” butonunu eklemek.
ve
Tabwidget

“.” butonu için doubleclick kullanmaya karar verdim.
tab widget sorun olmaz.
Tab kullanmanın mantığını öğrenmeye çalışıyorum şu anda.
Onu öğrendikten sonra tab’e bastığımda açılacak olan kısmı designer’dan yine tasarlayabilirim.
O şimdilik sorun değil.

“C” ve “DEL” butonları bahsettiğiniz şeyle ilgili herhangi bir sıkıntı çıkarmaz zaten.
C hepsini silecek.
Del ise sondan bir tane karakter silecek.

Makinalarda son yazılan karakteri silmek Yönü sola bakan ok şeklinde olduğu için göremeyince hatırlatma gereği duydum. Kolay gelsin.

1 Beğeni