Çözüldü Python Tkinter ve Discord bot aynı anda çalışamıyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

FazliBasturk

Hectopat
Katılım
10 Haziran 2020
Mesajlar
802
Çözümler
7
Daha fazla  
Cinsiyet
Erkek
Python ile Discord botu yazıyorum, tkinter ile GUI yapmak istedim. Kontrol paneli gibi bir şey olacaktı... Ama tkinter ı ekleyince ve çalıştırınca bot aktif olmuyor. Tkinter ile Discord aynı anda kullanılamaz mı?
 
Çözüm
def run_mainloop(window): window.mainloop()
Bu satırı silin hocam, daha sonra da en alttaki if'in içinde kalan kodu aşağıdakiyle değiştirin, bir de öyle deneyin:


[CODE lang="python" title="Örnek kod"]if __name__ == "__main__":
t2 = threading.Thread(target=run_bot, args=(client,))
t2.start()
window.mainloop()[/CODE]
Kodunuzu atma şansınız var mıdır acaba? Token vb. şeyleri gizleyebilirsiniz.

Edit: Şimdi biraz daha bakındım, evet sorun tkinter'in ana thread'i işgal etmesi. Ayrıca tkinter'i ana thread dışında çalıştırmak bahsettiğiniz hata mesajını çıkarabiliyormuş. Dolayısıyla sizin bot'u farklı bir thread içinde çalıştırmanız gerekiyor. Bir de öyle dener misiniz?
 
Son düzenleme:
Kodunuzu atma şansınız var mıdır acaba? Token vb. şeyleri gizleyebilirsiniz.

Edit: Şimdi biraz daha bakındım, evet sorun tkinter'in ana thread'i işgal etmesi. Ayrıca tkinter'i ana thread dışında çalıştırmak bahsettiğiniz hata mesajını çıkarabiliyormuş. Dolayısıyla sizin bot'u farklı bir thread içinde çalıştırmanız gerekiyor. Bir de öyle dener misiniz?

[CODE lang="python" title="Deneme Amaçlı Bot Kontrol"]import tkinter as tk
import threading
import discord
import asyncio

from discord.ext import tasks, commands
from discord.ext.commands import has_permissions, MissingPermissions, cooldown, BucketType

client = commands.Bot(command_prefix=('c!'), help_command=None, case_insensitive=True)

@client.event
async def on_ready():
print('Bağlanılan bot: {}'.format(client.user.name))
print('Bot ID: {}'.format(client.user.id))

def func(event):
print("Enter'a basıldı.")
entry.delete(0, tk.END)

def buton(event=None):
print("Buton'a basıldı.")
entry.delete(0, tk.END)

window = tk.Tk()

greeting = tk.Label(text="Bot Deneme")
entry = tk.Entry()
text_box = tk.Text()
text_box.configure(state="disabled")

greeting.pack()
text_box.pack()
entry.pack()

window.bind('<Return>', func)

button = tk.Button(window, text="Gönder", command=buton)
button.pack()

def run_mainloop(window):
window.mainloop()

def run_bot(client):
client.run('...')

if __name__ == "__main__":
t1 = threading.Thread(target=run_mainloop, args=(window,))
t2 = threading.Thread(target=run_bot, args=(client))
t1.start()
t2.start()
[/CODE]
 
def run_mainloop(window): window.mainloop()
Bu satırı silin hocam, daha sonra da en alttaki if'in içinde kalan kodu aşağıdakiyle değiştirin, bir de öyle deneyin:


[CODE lang="python" title="Örnek kod"]if __name__ == "__main__":
t2 = threading.Thread(target=run_bot, args=(client,))
t2.start()
window.mainloop()[/CODE]
 
Çözüm
Bu satırı silin hocam, daha sonra da en alttaki If'in içinde kalan kodu aşağıdakiyle değiştirin, bir de öyle deneyin:

[CODE lang="python" title="Örnek kod"]if __name__ == "__main__":
t2 = threading.Thread(target=run_bot, args=(client,))
t2.start()
window.mainloop()[/CODE]

Çok teşekkürler :), dünden beri o kadar çok şey denedimki delirecek duruma gelmiştim beni kurtardınız... Çok sağ olun yeniden.
 
Rica ederim. :) tkinter veya Kivy gibi GUI kütüphanelerini kullanırken Python'da thread/process olaylarına bir miktar hakim olmanız gerekiyor. Örneğin bu durumda botunuz çalışmadı, başka bir durumda penceredeki bir butona tıkladığınızda eğer arka planda çalışacak fonksiyon çok fazla iş yapacaksa ara yüzünüz donacak ve yanıt vermiyor hatası alacaksınız. O yüzden programınızda bu tarz donmalar vb. yaşanmaması için GUI ile birlikte threading/multiprocessing kütüphanelerini kullanmanızı şiddetle tavsiye ederim.
 

Yeni mesajlar

Geri
Yukarı