鱼C论坛

 找回密码
 立即注册
查看: 821|回复: 16

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

[复制链接]
发表于 2024-1-29 19:51:59 | 显示全部楼层 |阅读模式
20鱼币
我在写一个程序的时候遇到了一些问题

我的工作文件夹是这样的:
-- 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[0], text[1])

login.py
def login():

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

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



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

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


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

最佳答案

查看完整内容

对于上面的代码(由人造人提供),我点击login按钮后tkinter窗口不关闭 但是如果将ttk.Button(root, text = 'login', command = root.quit).grid()改为ttk.Button(root, text = 'login', command = root.destroy).grid(),点击login按钮后窗口就关闭了 但是我不确定你的main.py会不会报错,希望这能够见效
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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按钮后窗口就关闭了
删除tkinter窗口.gif
但是我不确定你的main.py会不会报错,希望这能够见效
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-1-29 19:52:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-29 20:05:37 | 显示全部楼层
来了,我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-29 20:14:49 | 显示全部楼层
本帖最后由 liuhongrun2022 于 2024-1-29 20:17 编辑

括号去了

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

如果你要传参,可以

Button(text="登陆", command = lambda: Exit_(参数))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-29 20:18:52 | 显示全部楼层
liuhongrun2022 发表于 2024-1-29 20:14
括号去了

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-29 20:20:00 | 显示全部楼层

想什么呢,没抄你的,这么简单的问题也没必要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-29 20:21:11 | 显示全部楼层
liuhongrun2022 发表于 2024-1-29 20:20
想什么呢,没抄你的,这么简单的问题也没必要

看在你互助团队有希望的份上,我就删了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-29 20:22:27 | 显示全部楼层
陶远航 发表于 2024-1-29 20:21
看在你互助团队有希望的份上,我就删了吧

好人一生平安
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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)
    """------------------------------发送框-------------------------------------------"""
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-30 15:04:54 | 显示全部楼层
Mike_python小 发表于 2024-1-29 22:16
大佬能帮我看看这个吗?
我把main函数注释掉了按照大佬这个方法能成功

把你这代码精简一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-1-30 17:46:30 | 显示全部楼层
人造人 发表于 2024-1-30 12:04
把你这代码精简一下

主要就是第10行他报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-1-30 17:53:07 | 显示全部楼层
人造人 发表于 2024-1-30 12:04
把你这代码精简一下

找到问题了,login.py中用quit方法没法关闭窗口 导致有两个tkinter窗口  请问怎么关闭呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-30 18:05:14 | 显示全部楼层
人造人 发表于 2024-1-29 20:37
刚学tkinter,布局还没整明白,自己布局吧
用英文单词是因为中文还乱码,^_^

调用Tk类生成的对象中的那个quit函数
ttk.Button(root, text = 'login', command = root.quit).grid()
像这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-1 11:25:16 | 显示全部楼层
本帖最后由 学C的h 于 2024-2-1 11:26 编辑


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-1 17:27:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 17:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表