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.
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ı
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.
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
Butona bastıktan sonra
İsim: Merhaba, Süre: 720s
ekranda beliriyor.
Hocam sadece şuraya kadar yapabildim.
# 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.
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.
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
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 ?