Butona basıldığında başka bir programı argümanlarla çalıştırma

Merhaba arkadaşlar. Benim sorunum şu. Oncelikle yeniyim onu belirteyim. Tkinter ile arayüz olustuyorum ama rlimdeki kodları nasil atayacağımı bilmiyorum. Dosya icerisinde main.py var mesela start butonuna basinca bunu çalıştırsın istiyorum. Main.py icinde zaman ve sayi kavramlari var bunlari da textbox icine yazinca main py de degissin o zamana göre yapsin istiyorum. Umarim anlatabilmişimdir. Teşekkürler şimdiden

Merhaba, aktardıklarınız biraz soyut kalıyor, minimal bir kod örneği paylaşmak isteyebilirsiniz. Kodunuzun tamamını değil de istediğiniz şeyi aktaran bir kod. Burada forumda kodun nasıl paylaşılabileceği aktarılıyor.

Çünkü başlıktan yola çıkarak aradığınız şeyin button = tk.Button(..., command=fonksiyon) olduğu düşünülebilir.

1 Beğeni

Hocam Şu şekilde elimde kodlarım var biraz uzun kusura bakmayın.
Bu kodlar yapılan botun main.py dosyası

from cv2 import cv2
import numpy as np
import   os
from time import time, sleep
import pydirectinput, pyautogui, threading
from ekranyakala import ekranYakala
from vision import Vision

 
# from detection import Detection

os.chdir(os.path.dirname(os.path.abspath(__file__)))

# Pencere başlığı sürekli değiştiği için tüm başlıkları tek tek yazdım.
baslik = ("METIN2",
"Lucas2 - Global Farm Server - lucas2.online",
"Lucas2 - Facebook: facebook.com/Lucas2TR",
"Lucas2 - Wiki: rehber.lucas2.online",
"Lucas2 - Discord: discord.gg/lucas2",
"Lucas2 - Kaliteyi Hisset - lucas2.online")

# Pencerenin başlığı eşleşene kadar dönüyor.
for i in baslik:
    try:
        wincap = ekranYakala(i)
    except:
        continue

# Model dosyası
cascade = cv2.CascadeClassifier('C:/Users/USER/Desktop/metin2bot/cascade/cascade.xml')

vision = Vision(None)
loop_time = time()

metine_vur = False
s = 1
s1 = 0
kontrol = 0
def metinevur(rectangles):
    global metine_vur
    global kontrol
    global s, s1

    if len(rectangles) > 0:
        targets = vision.get_click_points(rectangles)
        target = wincap.get_screen_position(targets[0])
        pyautogui.moveTo(x=target[0], y=target[1])
        sleep(0.1)
        pyautogui.rightClick(x=target[0], y=target[1]) #Bazı serverlarda sol click çalışmıyor. Burada da sağ click kullandık. Yine de sol click denemek isterseniz pyautogui.click bu kod ile değiştirin.
        print(s,"Metin Bulundu")
        sleep(1.2) #Metine gitme süresi. Metine tıkladıktan sonra kaç saniyede metine gittiği.1 yada 2 saniye yapın yeterli.
        pydirectinput.keyDown("space")
        sleep(2)  # Metin taşını kesme  hızınıza(saniye) göre bekletin. Yazdığınız saniye kadar space tuşuna basılı tutacak.
        pydirectinput.keyUp('space')
        s +=  1
        # Metin  taşını kesme  hızınıza(saniye) göre bekletin. Bu süreye dokunmayın. Space tuşu eklenince burası pasif durumda.
        sleep(0.1)
    else: 
        s1 += 1
        print(s1, "Bulunamadı")
        """
       e - Oyunda objeyi bulamazsa 6 defa 'e' tuşuna basar. yani ekranı döndürür.
        'f' ile kamerwwayı genişletir.
        - 3 defa bulamazsa 3 kez 'w'e basar ve ileri gider.

        Yani kısa cası burada yaptığımız işlem konum değiştirmek.
        Oynadığınız servere göre değiştirip geliştirebilirsiniz.

        Eğer oyun içinde tuş basmıyorsa programı yönetici olarak çalıştırıp deneyin.
        Yine olmazsa yapacak bişey yok :) yada ben bulamadım...
        """
        pydirectinput.press("e", presses=6)
        pydirectinput.press("f", presses=10)
        kontrol += 1
        #if kontrol >= 3:
            #print("Kontrol", kontrol)
            #pydirectinput.press("w", presses=3)
            #kontrol = 0

    metine_vur = False

while True:
    ss = wincap.get_screenshot()

    rectangles = cascade.detectMultiScale(ss)
    
    detection_image = vision.draw_rectangles(ss, rectangles)
    cv2.imshow('Goruntu', detection_image)

    if not metine_vur:
        """
        True, False kullanmamızın sebebi,
        Program sürekli döngüde kalacağı için,
        sadece 'false' durumlarda bu koşula girmesini istiyoruz.
        """
        metine_vur = True
        thrd = threading.Thread(target=metinevur, args=(rectangles,))
        thrd.start()

    # FPS göster
    # print("FPS {}".format(1 / (time() - loop_time)))
    # loop_time = time()
    
    # Döngüden çık
    key = cv2.waitKey(1)
    if key == ord("q"):
        cv2.destroyAllWindows()
        print("Bot Durduruldu")
        break
    	

Aşağıdaki resim botun dosyaları
bot2

Bu aşağıdaki program da QtDesigner ile yaptığım bir masaüstü uygulama. Botun çalışması şiçin normalde terminale python main.py yazıyorum. Ben bunu istemiyorum ben starta basıcna bot çalışsın istiyorum. Mesela saniye yazma yerleri var kodda elle yazıyorum ama ben bunu uygulama da nasıl yazıcam. Nasıl orası değişken olacak ve masaüstüne yazdığım zamanı oraya aktaracak.
bot

Bu da sonuncu. Ve yapamadığım o kodlar. Botun py dosyası.

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

# Form implementation generated from reading ui file 'bot.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(382, 255)
        self.durum = QtWidgets.QGroupBox(Form)
        self.durum.setGeometry(QtCore.QRect(199, 30, 181, 131))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.durum.setFont(font)
        self.durum.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.durum.setAutoFillBackground(True)
        self.durum.setInputMethodHints(QtCore.Qt.ImhNone)
        self.durum.setFlat(True)
        self.durum.setObjectName("durum")
        self.metinsayisi = QtWidgets.QLabel(self.durum)
        self.metinsayisi.setGeometry(QtCore.QRect(10, 40, 111, 51))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.metinsayisi.setFont(font)
        self.metinsayisi.setObjectName("metinsayisi")
        self.zaman = QtWidgets.QLabel(self.durum)
        self.zaman.setGeometry(QtCore.QRect(10, 70, 111, 41))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.zaman.setFont(font)
        self.zaman.setObjectName("zaman")
        self.ayarlar = QtWidgets.QGroupBox(Form)
        self.ayarlar.setGeometry(QtCore.QRect(10, 30, 191, 131))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.ayarlar.setFont(font)
        self.ayarlar.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.ayarlar.setAutoFillBackground(True)
        self.ayarlar.setFlat(True)
        self.ayarlar.setObjectName("ayarlar")
        self.ekranYakala = QtWidgets.QPushButton(self.ayarlar)
        self.ekranYakala.setGeometry(QtCore.QRect(110, 50, 44, 31))
        self.ekranYakala.setObjectName("ekranYakala")
        self.pencereListe = QtWidgets.QComboBox(self.ayarlar)
        self.pencereListe.setGeometry(QtCore.QRect(8, 51, 100, 31))
        self.pencereListe.setObjectName("pencereListe")
        self.saniye = QtWidgets.QSpinBox(self.ayarlar)
        self.saniye.setGeometry(QtCore.QRect(140, 90, 42, 31))
        self.saniye.setObjectName("saniye")
        self.metinsure = QtWidgets.QLabel(self.ayarlar)
        self.metinsure.setGeometry(QtCore.QRect(10, 90, 121, 31))
        font = QtGui.QFont()
        font.setPointSize(7)
        font.setBold(False)
        font.setWeight(50)
        self.metinsure.setFont(font)
        self.metinsure.setObjectName("metinsure")
        self.q = QtWidgets.QPushButton(Form)
        self.q.setGeometry(QtCore.QRect(200, 180, 120, 40))
        self.q.setObjectName("q")
        self.metine_vur = QtWidgets.QPushButton(Form)
        self.metine_vur.setGeometry(QtCore.QRect(60, 180, 120, 40))
        self.metine_vur.setObjectName("metine_vur")
        self.line_2 = QtWidgets.QFrame(Form)
        self.line_2.setGeometry(QtCore.QRect(50, 160, 281, 16))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(40, 230, 131, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(220, 229, 121, 21))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.line = QtWidgets.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(180, 230, 16, 31))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.durum.setTitle(_translate("Form", "Durum"))
        self.metinsayisi.setText(_translate("Form", "Bulunan Metin:"))
        self.zaman.setText(_translate("Form", "Geçen Süre:"))
        self.ayarlar.setTitle(_translate("Form", "Ayarlar"))
        self.ekranYakala.setText(_translate("Form", "ARA"))
        self.metinsure.setText(_translate("Form", "Metin Taşı Kesme Süresi (sn)"))
        self.q.setText(_translate("Form", "DURDUR"))
        self.metine_vur.setText(_translate("Form", "BAŞLAT"))
        self.label_4.setText(_translate("Form", "Developer: F0Rextasy"))
        self.label_5.setText(_translate("Form", "yazilimfuryasi.com"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

Tamamdır anladığım kadarıyla yazayım. Bu arada Tkinter değil PyQt ile yazmışsınız :d. Ben şuraya tuşa basıldığında başka bir Python script’ini çalıştıran ve o script’e bir-iki argüman gönderen bir örnek yazayım, siz de kendi kodunuza adapte edersiniz diye düşünüyorum (Tkinter ile yazayım, mevzu aynı.)

Başka bir Python dosyasını çalıştırmak adına, o komut satırından elle yaptığınızı taklit etmek için subprocess modülünden run fonksiyonunu kullanabiliriz. O script’e argüman paslamayı da sağlar. Script’in o argümanları elde etmesi için ise sys.argv listesi yeterli olacaktır diye zannediyorum.

Evvela GUI programı:

# burası arayuz.py

import subprocess
import tkinter as tk

# sizin `main.py` dosyasının yolu
CALISTIRILACAK_DOSYANIN_YOLU = r"..."

# ana ekran
pencere = tk.Tk()

# İki label koyuyoruz entry'lerin ne olduğunu anlamak için
tk.Label(pencere, text="Süre:").grid(row=0, column=0)
tk.Label(pencere, text="İsim:").grid(row=1, column=0)

# Entry'ler
sure_entry = tk.Entry(pencere)
sure_entry.grid(row=0, column=1)

isim_entry = tk.Entry(pencere)
isim_entry.grid(row=1, column=1)

# butona basıldığında çalışan fonksiyon
def calistir():
    # Entry'lerden veriyi al
	sure = sure_entry.get()
	isim = isim_entry.get()
	
    # komut satırına yazılacakların listesi ve çalıştırılması
	argumanlar = "python", CALISTIRILACAK_DOSYANIN_YOLU, sure, isim
	subprocess.run(argumanlar)
	
# işi başlatan buton
buton = tk.Button(pencere, text="Diğer dosyayı çalıştır", command=calistir)
buton.grid(row=2, columnspan=2)

pencere.mainloop()

Önemli nokta butona bağladığımız calistir fonksiyonu. Kullanıcının girdiği değerleri alıp bunlarla beraber diğer Python dosyasını çalıştırıyor. Örneğin süreye 12, isime de merhaba girildiyse, verilen komut python main.py 12 merhaba oluyor. Şimdi main.py'a bakıyoruz:

# burası main.py

import sys

# ilk argüman dosyanın ismidir, es geçiyoruz
_, sure, isim = sys.argv

# verilerle artık ne yaparsanız
sure = int(sure) * 60
isim = isim.title()

print(f"İsim: {isim}, Süre: {sure}s")

Burada python main.py 12 merhaba'daki "main.py", "12", "merhaba" değerlerini sys.argv'den alıyoruz.

Mesela konsoldan arayuz.py’yi çalıştırıyorum

image

Butona bastıktan sonra

İsim: Merhaba, Süre: 720s

ekranda beliriyor.

1 Beğeni

Hocam sadece şuraya kadar yapabildim. :rofl:

# burası arayuz.py

import subprocess
import tkinter as tk

# sizin `main.py` dosyasının yolu
CALISTIRILACAK_DOSYANIN_YOLU = r"..."

# ana ekran
pencere = tk.Tk()

Dosyayı çalıştırıyor şuan başlata tıkladığımda. Ama stop ve diğer butonlar ıkoyup onlara nasıl işlev vericem?

PyQt5 ise <buton>.clicked.connect(fonksiyon), Tkinter ise <buton> = tk.Button(..., command=fonksiyon) ile.

1 Beğeni

Hocam benim verdiğim kodlarla 1-2 satırı dolduru musunuz ? İlk defa yaptığım için gerçekten anlamıyorum.

Tkinter ise <buton> = tk.Button(..., command=fonksiyon) ile.

mesela şurada fonksiyon yazan yere ben ekranyakala.py mi yazıcam o dosyayı çalıştırması için ?

ekranyakala.py'da fonksiyon adında bir fonksiyon varsa onu yazıcaksınız. Tabii önce ekranyakala.py'i projeye dahil etmek gerekiyor.

Yok, bunu yukarıdaki yanıtta aktarmaya çalışmıştım. Bir fonksiyon tanımlayıp (calistir adında mesela) içerisinde subprocess.run kullanarak diğer programı çalıştırıyoruz.

Ben hala anlamadım hocam.

benim kodlardan örnek verir misiniz hocam ?

Github linkide bu

Burada çalıştırıyor demişsiniz, şu an çalışmayan kısım neresi onu tam anlayamadım.

hocam çalıştırıyor evet ama benim dediğim diğer argümanları nasıl ekliyeceğim.
bot
bu resimdeki fonksiyonları tek tek atıycam onu nasıl yapıcam?

Hemen örnek veriyorum (ama @anon18277073 'in dediklerini bi okuyun sindirin öyle benim örneğimi inceleyin)

a.py
def uslu_sayi(taban,us):
    return taban**us
b.py
import tkinter as tk
import a

anaPencere = tk.Tk()
anaPencere.geometry("300x200")
anaPencere.title("Pencere")
usAlmaButonu = tk.Button(anaPencere,text="Üs al",command = lambda: print(a.uslu_sayi(5,2))) # "lambda" tek satırlık fonksiyon yazmaya yarayan bir anahtar kelime, command parametresi her çağrıldığında tek satırlık fonksiyonun içinde tanımlanan "a.py" den gelen "uslu_sayi" adlı fonksiyonu çağırıyor. Bunu da ekrana yazdırmak için "print" in içinde gerçekleştiriyor.
usAlmaButonu.pack()
anaPencere.mainloop()

Böylelikle başka bir .py dosyasındaki fonksiyonu projede istenen yere eklemiş olabiliyoruz
(tkinter kütüphanesi kullanacaksanız bu haliyle yapılıyor.)

Siz hocam o kodların neresinde a.py yi çalıştır dediniz butona ?

usAlmaButonu değişkenini incelerseniz görebilirsiniz.

hocam benim verdiğim kodla örnek verir misin?
Gerçekten yeniyim anlamak çok zor :grinning:

Zaten @anon18277073 burada söylemiş somut bir örnek vereyim o halde:

a.py
sayac = 0
def baslat():
    global sayac  # bu değişken fonksiyon dışında tanımlandığından "global" anahtar kelimesi ile belirttik,
    sayac += 1    # sayac değişkenine fonksiyon her çalıştığında "1(tam sayı)"  üzerine ekledik (1,2,3,4....)
    return sayac  # daha sonra bu değişkeni "return" anahtar kelimesiyle döndürdük

Pencere Tasarımı(sizin kodunuz) değişiklik yapılan kısmı # ile belirttim
import a
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(382, 255)
        self.durum = QtWidgets.QGroupBox(Form)
        self.durum.setGeometry(QtCore.QRect(199, 30, 181, 131))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.durum.setFont(font)
        self.durum.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.durum.setAutoFillBackground(True)
        self.durum.setInputMethodHints(QtCore.Qt.ImhNone)
        self.durum.setFlat(True)
        self.durum.setObjectName("durum")
        self.metinsayisi = QtWidgets.QLabel(self.durum)
        self.metinsayisi.setGeometry(QtCore.QRect(10, 40, 111, 51))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.metinsayisi.setFont(font)
        self.metinsayisi.setObjectName("metinsayisi")
        self.zaman = QtWidgets.QLabel(self.durum)
        self.zaman.setGeometry(QtCore.QRect(10, 70, 111, 41))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.zaman.setFont(font)
        self.zaman.setObjectName("zaman")
        self.ayarlar = QtWidgets.QGroupBox(Form)
        self.ayarlar.setGeometry(QtCore.QRect(10, 30, 191, 131))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.ayarlar.setFont(font)
        self.ayarlar.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.ayarlar.setAutoFillBackground(True)
        self.ayarlar.setFlat(True)
        self.ayarlar.setObjectName("ayarlar")
        self.ekranYakala = QtWidgets.QPushButton(self.ayarlar)
        self.ekranYakala.setGeometry(QtCore.QRect(110, 50, 44, 31))
        self.ekranYakala.setObjectName("ekranYakala")
        self.pencereListe = QtWidgets.QComboBox(self.ayarlar)
        self.pencereListe.setGeometry(QtCore.QRect(8, 51, 100, 31))
        self.pencereListe.setObjectName("pencereListe")
        self.saniye = QtWidgets.QSpinBox(self.ayarlar)
        self.saniye.setGeometry(QtCore.QRect(140, 90, 42, 31))
        self.saniye.setObjectName("saniye")
        self.metinsure = QtWidgets.QLabel(self.ayarlar)
        self.metinsure.setGeometry(QtCore.QRect(10, 90, 121, 31))
        font = QtGui.QFont()
        font.setPointSize(7)
        font.setBold(False)
        font.setWeight(50)
        self.metinsure.setFont(font)
        self.metinsure.setObjectName("metinsure")
        self.q = QtWidgets.QPushButton(Form)
        self.q.setGeometry(QtCore.QRect(200, 180, 120, 40))
        self.q.setObjectName("q")
        self.metine_vur = QtWidgets.QPushButton(Form)
        self.metine_vur.setGeometry(QtCore.QRect(60, 180, 120, 40))
        self.metine_vur.setObjectName("metine_vur")

        self.metine_vur.clicked.connect(lambda: print(a.baslat())) #####
        
        self.line_2 = QtWidgets.QFrame(Form)
        self.line_2.setGeometry(QtCore.QRect(50, 160, 281, 16))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(40, 230, 131, 20))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(220, 229, 121, 21))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(False)
        font.setWeight(50)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.line = QtWidgets.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(180, 230, 16, 31))
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.durum.setTitle(_translate("Form", "Durum"))
        self.metinsayisi.setText(_translate("Form", "Bulunan Metin:"))
        self.zaman.setText(_translate("Form", "Geçen Süre:"))
        self.ayarlar.setTitle(_translate("Form", "Ayarlar"))
        self.ekranYakala.setText(_translate("Form", "ARA"))
        self.metinsure.setText(_translate("Form", "Metin Taşı Kesme Süresi (sn)"))
        self.q.setText(_translate("Form", "DURDUR"))
        self.metine_vur.setText(_translate("Form", "BAŞLAT"))
        self.label_4.setText(_translate("Form", "Developer: F0Rextasy"))
        self.label_5.setText(_translate("Form", "yazilimfuryasi.com"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

metine_vur bizim komutumuz mu oluyor yani ?
metin sayısı kodu da ‘s’ oluyor o zaman ?
Bu şekilde mi ?
pencereListe.py dosyası var. Ara butonuna bastığında orada tüm açık windows uygulamalarını gösterecek. Oranın da komutu pencereListe oluyor. Bu şekilde mi hocam ?