質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

836閲覧

PythonでDiscordとTkinterを用いてDiscordのボットにメッセージを送信させる

qwdavid

総合スコア1

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/05/13 14:26

実現したいこと

GUIでDiscordのボットにメッセージを送信させる

前提

PythonでTkinterとDiscord.pyを用いてGUIでDiscordのボットにメッセージを送信させるアプリケーションを作成しています

発生している問題・エラーメッセージ

送信ボタンを押しても何も送信されませんでした エラーメッセージとかは出ませんでした

該当のソースコード

Python

1import threading 2from tkinter import * 3import discord 4import asyncio 5 6bot = None 7 8def setBot(): 9 global bot 10 bot = discord.Client(intents = discord.Intents.all()) 11 bot.run(とーくん) 12 13def sendMessage(message,channelID): 14 global bot 15 @bot.event 16 async def on_ready(): 17 while True: 18 channel = bot.get_channel(int(channelID)) 19 await channel.send(message) 20 21def isInputTextOk(diff): 22 if not diff.encode('utf-8').isdigit(): 23 return False 24 return True 25 26 27def setWindow(): 28 29 root = Tk() 30 root.title("DiscordBot") 31 root.geometry("800x500") 32 root.resizable(False, False) 33 34 tcl_isInputTextOk = root.register(isInputTextOk) 35 36 label1 = Label(root, text="チャンネルID:", font=("", 15)) 37 label1.place(x=10, y=10) 38 label2 = Label(root, text="インプット:", font=("", 15)) 39 label2.place(x=10, y=30) 40 41 TextBox1 = Text(bg="#000", fg="#fff",insertbackground="#fff") 42 TextBox1.place(x=10, y=60, width=780, height=400) 43 44 txt1 = Entry(width=40,validate='key',vcmd=(tcl_isInputTextOk, '%S')) 45 txt1.place(x=160, y=15) 46 47 SendButton = Button(root, text="送信", font=("", 15),command=lambda:sendMessage(TextBox1.get("1.0"),txt1.get())) 48 SendButton.place(x=730, y=10) 49 50 root.mainloop() 51 52if __name__ == "__main__": 53 54 setWindowThread = threading.Thread(target=setWindow,args=()) 55 setWindowThread.start() 56 57 setBotThread = threading.Thread(target=setBot(),args=()) 58 setBotThread.start()

です
わかる方いたら回答お願いします;;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

discord.pyは非同期処理を行うライブラリであり、そのためGUIライブラリとの組み合わせは少し複雑になります。これには通常、イベントループの問題があります。Tkinterとdiscord.pyはそれぞれ独自のイベントループを持っているため、その違いをうまく管理する必要があります。

また、あなたのコードではsendMessage関数内でon_readyイベントを定義していますが、これは適切ではありません。on_readyイベントはbotが準備完了したときに一度だけ自動的に呼び出されるもので、通常はメインのbot定義の中に書かれます。

以下に示すのは、Tkinterとdiscord.pyを組み合わせてメッセージを送信するための基本的なアプローチです。注意すべき点は、非同期関数を同期的に呼び出すために、asyncio.run_coroutine_threadsafeを使用していることです。

import tkinter as tk import discord import asyncio TOKEN = "your-bot-token" CHANNEL_ID = 1234567890 # your channel id client = discord.Client() @client.event async def on_ready(): print(f'We have logged in as {client.user}') def send_message(message): channel = client.get_channel(CHANNEL_ID) coro = channel.send(message) future = asyncio.run_coroutine_threadsafe(coro, client.loop) future.result() root = tk.Tk() entry = tk.Entry(root) entry.pack() button = tk.Button(root, text='Send', command=lambda: send_message(entry.get())) button.pack() def start_bot(): client.run(TOKEN) if __name__ == '__main__': import threading threading.Thread(target=start_bot, daemon=True).start() root.mainloop()

ただし、このコードはチャンネルIDを固定にしています。あなたが動的にチャンネルIDを変更したい場合は、send_message関数を修正してチャンネルIDを引数として受け取るようにすると良いでしょう。

以上が基本的なアプローチで、実際の使用にはさらに調整が必要な場合があります。たとえば、エラーハンドリングを追加したり、send_message関数が呼び出される前にBotが準備完了していることを確認したりするなどです。

投稿2023/05/15 02:05

m8aFm77kKU9JuID

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwdavid

2023/05/15 10:52

ありがとうございます!助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問