如何将python逻辑应用到tkinter GUI中?这是一个简单的GET请求程序

2024-06-20 15:16:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个发送短信的程序。我唯一的问题是我不能用tkinter做任何事情。对不起,如果听起来有点混乱,英语不是我的第一语言,我会尽力解释清楚

这是一个通过my API发送SMS文本的简单GET请求:

# GET
import requests
to = input("Enter Receiver: ") 
fromm = input("Enter Sender: ") 
message = input("Enter Message: ") 


payload = {'to': to, 'from': fromm, 'message': message, 'email': '@example.com', 'api_secret': '123456789abcdefg'}
r = requests.get('https://example.com/dashboard/api',params=payload)

print(r.text)

发送此Get请求后,我们将收到一个json响应,确认消息已发送

这就是我使用tkinter的GUI的外观:

from tkinter import *

def send_message():
    print('sent')

def clear_text():
    print('cleared')

#window object
app = Tk()
# Sender
Sender_text = StringVar()
Sender_label = Label(app, text='Sender', font=('bold', 14), pady=20)
Sender_label.grid(row=0, column=0, sticky=W)
Sender_entry = Entry(app, textvariable=Sender_text)
Sender_entry.grid(row=0, column=1)
# Receiver
Receiver_text = StringVar()
Receiver_label = Label(app, text='Receiver', font=('bold', 14))
Receiver_label.grid(row=0, column=2, sticky=W)
Receiver_entry = Entry(app, textvariable=Receiver_text)
Receiver_entry.grid(row=0, column=3)
# Message
Message_text = StringVar()
Message_label = Label(app, text='Message', font=('bold', 14))
Message_label.grid(row=1, column=0, sticky=W)
Message_entry = Entry(app, textvariable=Message_text)
Message_entry.grid(row=1, column=1)
# Buttons
send_btn = Button(app, text='Send', width=12, command=send_message)
send_btn.grid(row=2, column=0, pady=20)
clear_btn = Button(app, text='Clear', width=12, command=clear_text)
clear_btn.grid(row=2, column=1)


app.title('SMS')
app.geometry('430x145')

#start
app.mainloop()

我花了大约两个小时来学习如何制作GUI,但现在我完全迷路了。我不知道如何在GUI中实现逻辑。 如何制作文本&;按钮有用吗?在哪里添加函数? 我真的迷路了

非常感谢您的帮助


Tags: textsendappmessagetkintercolumnlabelsender
2条回答

参考您的GUI,让我们为您的代码提供更多的结构,以便更清楚地看到正在发生的事情。 我将窗口的设置放在一个函数my_window中,将参数appmain传递给它。按下按钮sendsender_textreceiver_textmessage_text的值通过使用sender_text.get()receiver_text.get()等获得。。这些结果通过lambda函数传递给函数send_message

from tkinter import Tk, StringVar, Label, Entry, Button, W


def send_message(snd_txt, rcv_txt, msg_txt):
    print(f'sent: {snd_txt}, {rcv_txt}, {msg_txt}')


def clear_text():
    print('cleared')


def my_window(app):

    # Sender
    sender_text = StringVar()
    sender_label = Label(app, text='Sender', font=('bold', 14), pady=20)
    sender_label.grid(row=0, column=0, sticky=W)
    sender_entry = Entry(app, textvariable=sender_text)
    sender_entry.grid(row=0, column=1)

    # Receiver
    receiver_text = StringVar()
    receiver_label = Label(app, text='Receiver', font=('bold', 14))
    receiver_label.grid(row=0, column=2, sticky=W)
    receiver_entry = Entry(app, textvariable=receiver_text)
    receiver_entry.grid(row=0, column=3)

    # Message
    message_text = StringVar()
    message_label = Label(app, text='Message', font=('bold', 14))
    message_label.grid(row=1, column=0, sticky=W)
    message_entry = Entry(app, textvariable=message_text)
    message_entry.grid(row=1, column=1)

    # Buttons
    send_btn = Button(
        app, text='Send', width=12,
        command=lambda: send_message(sender_text.get(), receiver_text.get(), message_text.get()))
    send_btn.grid(row=2, column=0, pady=20)
    clear_btn = Button(app, text='Clear', width=12, command=clear_text)
    clear_btn.grid(row=2, column=1)


def main():
    app = Tk()
    app.title('SMS')
    app.geometry('430x145')
    my_window(app)
    app.mainloop()


if __name__ == '__main__':
    main()

然而,更常见的是将my_window定义为class,并使该clear_text的函数clear_textsend_message方法具有更大的灵活性

from tkinter import Tk, StringVar, Label, Entry, Button, W


class my_window:

    def __init__(self, app):
        # Sender
        self.sender_text = StringVar()
        sender_label = Label(app, text='Sender', font=('bold', 14), pady=20)
        sender_label.grid(row=0, column=0, sticky=W)
        sender_entry = Entry(app, textvariable=self.sender_text)
        sender_entry.grid(row=0, column=1)

        # Receiver
        self.receiver_text = StringVar()
        receiver_label = Label(app, text='Receiver', font=('bold', 14))
        receiver_label.grid(row=0, column=2, sticky=W)
        receiver_entry = Entry(app, textvariable=self.receiver_text)
        receiver_entry.grid(row=0, column=3)

        # Message
        self.message_text = StringVar()
        message_label = Label(app, text='Message', font=('bold', 14))
        message_label.grid(row=1, column=0, sticky=W)
        message_entry = Entry(app, textvariable=self.message_text)
        message_entry.grid(row=1, column=1)

        # Buttons
        send_btn = Button(app, text='Send', width=12, command=self.send_message)
        send_btn.grid(row=2, column=0, pady=20)
        clear_btn = Button(app, text='Clear', width=12, command=self.clear_text)
        clear_btn.grid(row=2, column=1)

    def send_message(self):
        print(f'sent: {self.sender_text.get()}, '
              f'{self.receiver_text.get()}, '
              f'{self.message_text.get()}')

    def clear_text(self):
        self.sender_text.set('')
        self.receiver_text.set('')
        self.message_text.set('')
        print('cleared')


def main():
    app = Tk()
    app.title('SMS')
    app.geometry('430x145')
    my_window(app)
    app.mainloop()


if __name__ == '__main__':
    main()

您只需将逻辑(用xxx.get()替换所有input())放入函数send_message()

import requests

def send_message():
    receiver = Receiver_text.get()
    sender = Sender_text.get()
    message = Message_text.get()

    payload = {'to': receiver, 'from': sender, 'message': message, 
               'email': '@example.com', 'api_secret': '123456789abcdefg'}
    r = requests.get('https://example.com/dashboard/api', params=payload)
    print(r.text)

相关问题 更多 >