Mike_python小 发表于 2024-1-29 19:51:59

一个关于python tkinter的关闭进程及返回值问题

我在写一个程序的时候遇到了一些问题

我的工作文件夹是这样的:
-- main.py
-- login.py

在main.py中有一个函数检查输入的账号密码是否正确,然后需要启动一个tkinter界面

在login.py中有一个函数启动tkinter界面,之后等待用户输入密码输入后结束这个tkinter界面并且返回账号密码与main.py



但是我在实际的编写中发现使用return返回结果后并不能关闭这个窗口之后使用 destroy() quit() 以及 exit() 都无法关闭这个tkinter窗口在手动关闭后main.py显示返回值是None


一下是简略的代码内容

main.py
from login import login

def jianyan(a, b):
    pass


text = login()
jianyan(text, text)

login.py
def login():

    def Exit_():
      return var1, var2
      exit()

    var1 = '用户'
    var2 = '密码'



    Button(text="登陆", command = Exit_())

这种情况需要怎么办来请教一下各位大佬


说明一下 : 在login之后需要tkinter界面   在main也需要这就是为什么一定要把login的界面quit掉

smallwh 发表于 2024-1-29 19:52:00

本帖最后由 smallwh 于 2024-2-9 09:17 编辑

from tkinter import Tk, ttk
import tkinter

def login():
    root = Tk()
    root.geometry('640x480')
    ttk.Label(root, text = 'user').grid()
    ttk.Label(root, text = 'passwd').grid()
    user = tkinter.StringVar()
    password = tkinter.StringVar()
    ttk.Entry(root, textvariable = user).grid()
    ttk.Entry(root, textvariable = password, show = '*').grid()
    ttk.Button(root, text = 'login', command = root.quit).grid()
    root.mainloop()
    return (user.get(), password.get())

if __name__ == '__main__':
    text = login()
    print(text)
对于上面的代码(由人造人提供),我点击login按钮后tkinter窗口不关闭
但是如果将ttk.Button(root, text = 'login', command = root.quit).grid()改为ttk.Button(root, text = 'login', command = root.destroy).grid(),点击login按钮后窗口就关闭了

但是我不确定你的main.py会不会报错,希望这能够见效

Mike_python小 发表于 2024-1-29 19:52:46

@额外减小 @tommyyu @liuhongrun2022 @陶远航 @人造人

求解答{:10_254:}{:10_254:}{:10_254:}

liuhongrun2022 发表于 2024-1-29 20:05:37

来了,我看看

liuhongrun2022 发表于 2024-1-29 20:14:49

本帖最后由 liuhongrun2022 于 2024-1-29 20:17 编辑

括号去了

Button(text="登陆", command = Exit_)

如果你要传参,可以

Button(text="登陆", command = lambda: Exit_(参数))

陶远航 发表于 2024-1-29 20:18:52

liuhongrun2022 发表于 2024-1-29 20:14
括号去了

Button(text="登陆", command = Exit_)


{:10_295:}

liuhongrun2022 发表于 2024-1-29 20:20:00

陶远航 发表于 2024-1-29 20:18


想什么呢,没抄你的,这么简单的问题也没必要{:10_277:}

陶远航 发表于 2024-1-29 20:21:11

liuhongrun2022 发表于 2024-1-29 20:20
想什么呢,没抄你的,这么简单的问题也没必要

看在你互助团队有希望的份上,我就删了吧{:10_256:}

liuhongrun2022 发表于 2024-1-29 20:22:27

陶远航 发表于 2024-1-29 20:21
看在你互助团队有希望的份上,我就删了吧

好人一生平安{:5_110:}

人造人 发表于 2024-1-29 20:37:32

刚学tkinter,布局还没整明白,自己布局吧
用英文单词是因为中文还乱码,^_^

#!/usr/bin/env python
#coding=utf-8

from tkinter import Tk, ttk
import tkinter

def login():
    root = Tk()
    root.geometry('640x480')
    ttk.Label(root, text = 'user').grid()
    ttk.Label(root, text = 'passwd').grid()
    user = tkinter.StringVar()
    password = tkinter.StringVar()
    ttk.Entry(root, textvariable = user).grid()
    ttk.Entry(root, textvariable = password, show = '*').grid()
    ttk.Button(root, text = 'login', command = root.quit).grid()
    root.mainloop()
    return (user.get(), password.get())

text = login()
print(text)

Mike_python小 发表于 2024-1-29 22:16:54

人造人 发表于 2024-1-29 17:37
刚学tkinter,布局还没整明白,自己布局吧
用英文单词是因为中文还乱码,^_^

大佬能帮我看看这个吗?
我把main函数注释掉了按照大佬这个方法能成功


但是不注释的话就会报错

Exception in thread T2:
Traceback (most recent call last):
File "C:\Users\Qin_\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1052, in _bootstrap_inner
    self.run()
File "C:\Users\Qin_\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 989, in run
    self._target(*self._args, **self._kwargs)
File "c:\Users\Qin_\Desktop\Program\在线聊天室\Version 4.0(春节特供版)\client.py", line 77, in fasong
    re_data = send_entry.get("1.0", END)[:-1]
            ^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "c:\Users\Qin_\Desktop\Program\在线聊天室\Version 4.0(春节特供版)\client.py", line 603, in <module>
    loginSendToServer(loginfuc1, loginfuc2)
File "c:\Users\Qin_\Desktop\Program\在线聊天室\Version 4.0(春节特供版)\client.py", line 56, in loginSendToServer
    main()
File "c:\Users\Qin_\Desktop\Program\在线聊天室\Version 4.0(春节特供版)\client.py", line 497, in main
    image_button = Button(centerFrame, image=photo, bootstyle="info-outline", command=sendImage)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Qin_\AppData\Local\Programs\Python\Python312\Lib\site-packages\ttkbootstrap\style.py", line 4941, in __init__
    func(self, *args, **kwargs)
File "C:\Users\Qin_\AppData\Local\Programs\Python\Python312\Lib\tkinter\ttk.py", line 582, in __init__
    Widget.__init__(self, master, "ttk::button", kw)
File "C:\Users\Qin_\AppData\Local\Programs\Python\Python312\Lib\tkinter\ttk.py", line 527, in __init__
    tkinter.Widget.__init__(self, master, widgetname, kw=kw)
File "C:\Users\Qin_\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2629, in __init__
    self.tk.call(
_tkinter.TclError: image "pyimage9" doesn't exist


第一个报错不用管,没事

但是后面那个报错   我图片什么在之前都能够正常用现在就报错了

用绝对路径也不行

    """------------------------------发送框-------------------------------------------"""
    send_entry = Text(centerFrame, width=55, height=4, font=("微软雅黑", 13)) # 发送区域
    send_entry.place(x=10, y=460)


    send_button = Button(centerFrame, text="\n发 送\n", command=fasong_Init)   # 发送按钮
    send_button.place(x=585, y=460)

    phtotICON = Image.open(r"C:\Users\Qin_\Desktop\Program\在线聊天室\Version 4.0(春节特供版)\log\image1.png")
    photowidth, photoheight = phtotICON.size
    photonew_width = int(photowidth * 0.06)# 调整宽度为原始宽度的50%
    photonew_height = int(photoheight * 0.06)# 调整高度为原始高度的50%
    photoimage = phtotICON.resize((photonew_width, photonew_height))# 调整图像大小
    photo = ImageTk.PhotoImage(photoimage)

    image_button = Button(centerFrame, image=photo, bootstyle="info-outline", command=sendImage)
    image_button.place(x=575, y=530)

    phtotICON1 = Image.open(r"./log\设置_setting-three.png")
    photowidth1, photoheight1 = phtotICON1.size
    photonew_width1 = int(photowidth1 * 0.06)# 调整宽度为原始宽度的50%
    photonew_height1 = int(photoheight1 * 0.06)# 调整高度为原始高度的50%
    photoimage1 = phtotICON1.resize((photonew_width1, photonew_height1))# 调整图像大小
    photo1 = ImageTk.PhotoImage(photoimage1)

    settingButton = Button(centerFrame, image=photo1, bootstyle="info-outline", command=SystemSetting)
    settingButton.place(x=613, y=530)


    send_entry.bind("<Return>", fasong_Init)
    send_entry.bind("<Control-Return>", insert_newline)
    """------------------------------发送框-------------------------------------------"""

人造人 发表于 2024-1-30 15:04:54

Mike_python小 发表于 2024-1-29 22:16
大佬能帮我看看这个吗?
我把main函数注释掉了按照大佬这个方法能成功



把你这代码精简一下

Mike_python小 发表于 2024-1-30 17:46:30

人造人 发表于 2024-1-30 12:04
把你这代码精简一下

主要就是第10行他报错了

Mike_python小 发表于 2024-1-30 17:53:07

人造人 发表于 2024-1-30 12:04
把你这代码精简一下

找到问题了,login.py中用quit方法没法关闭窗口 导致有两个tkinter窗口请问怎么关闭呢?

人造人 发表于 2024-1-30 18:05:14

人造人 发表于 2024-1-29 20:37
刚学tkinter,布局还没整明白,自己布局吧
用英文单词是因为中文还乱码,^_^

调用Tk类生成的对象中的那个quit函数
ttk.Button(root, text = 'login', command = root.quit).grid()
像这样

学C的h 发表于 2024-2-1 11:25:16

本帖最后由 学C的h 于 2024-2-1 11:26 编辑


zhangchenyvn 发表于 2024-2-1 17:27:48

学C的h 发表于 2024-2-1 11:25


?
页: [1]
查看完整版本: 一个关于python tkinter的关闭进程及返回值问题