Tkinter中新建窗口内Entry无法获取值

本文介绍如何使用Python的Tkinter库创建一个窗口,实现在点击按钮后弹出新窗口输入信息,并将输入保存到文件。重点在于解决不同窗口间数据交互的问题,以及使用Toplevel窗口替代默认窗口以实现有效互动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
import tkinter as tk
import os

REMEMBER_FILE_NAME='remember.txt'
ROOT_SIZE=(400, 280)
INPUT_ROOT_SIZE=(300, 150)

class WindowsRemember :
	def __init__(self) :
		self._root = None
		self._text = None
		self.initWindows()
	
	def initWindows(self) :
		self._root = tk.Tk()
		self._root.wm_attributes('-alpha', 0.5)  #透明度
		self._root.wm_attributes('-toolwindow', True) #取消缩小扩大按钮
		self._root.wm_attributes('-topmost', True) #置于顶层
		self._root.title('123') 
		self._root.geometry(str(ROOT_SIZE[0])+'x'+str(ROOT_SIZE[1])) #设置大小
		self._root.geometry('+0+0')
		self._btn_add = None
		self._btn_sub = None
		self._input_text = None
	
	def showText(self) :
		#photo = PhotoImage(file='C:\\Users\\Administrator\\Desktop\\timg.gif')    #python 默认支持gif格式
		#imgLabel = Label(root,image = photo)
		#self._text.pack() #side=tk.LEFT)
		end_dir = os.getcwd()
		file_path = end_dir + '\\' + REMEMBER_FILE_NAME
		file = open(file_path, 'r', encoding='UTF-8')
		file_desc = ''
		idx = 1
		for line in file.readlines() :
			file_desc = file_desc + str(idx) + '  ' + line
			idx += 1
		file.close()
		self._text = tk.Label(self._root, text=file_desc, justify='left', anchor=tk.W)
		self._text.place(x=5)
		self._btn_add = tk.Button(self._root, text='ADD', command=self.addText, activebackground='blue', anchor=tk.N)
		self._btn_add.place(x=ROOT_SIZE[0]/2-50, y=ROOT_SIZE[1]-50)
		print (self._btn_add.winfo_width())
		self._btn_sub = tk.Button(self._root, text='SUB', command=self.subText, activebackground='blue', anchor=tk.N)
		self._btn_sub.place(x=ROOT_SIZE[0]/2+30, y=ROOT_SIZE[1]-50)
	
	def addText(self) :
		add_root = tk.Tk()  #?????????????????????
		add_root.title('Please input:') 
		add_root.wm_attributes('-toolwindow', True)
		add_root.wm_attributes('-topmost', True)
		add_root.geometry(str(INPUT_ROOT_SIZE[0])+'x'+str(INPUT_ROOT_SIZE[1]))
		self._input_text = None
		#label = tk.Label(add_root, text='input:', height=5, width=INPUT_ROOT_SIZE[0]-50)
		#label.place(x=5)
		self._input_text = tk.StringVar()
		tmp = tk.Entry(add_root, textvariable=self._input_text, width=int(INPUT_ROOT_SIZE[0]/10))
		tmp.pack()
		def _sure_cb() :
			print('====', self._input_text.get())
		btn_sure = tk.Button(add_root, text='SURE', command=_sure_cb, activebackground='blue', anchor=tk.N)
		#btn_sure.place(x=INPUT_ROOT_SIZE[0]/2, y=INPUT_ROOT_SIZE[1]-50)
		btn_sure.pack(side=tk.BOTTOM)

		add_root.mainloop()
	
	def subText(self) :
		pass
	

def main() :	
	root = WindowsRemember()
	root.showText()
	root._root.mainloop()
main()

        代码有点丑,总的思想就是,tk.Tk()创建一个窗口后,点某个按钮再创建一个tk.Tk()窗口,但是self._input_text.get()获取输入的数据失败,原因是,tk.Tk()创建的是一个新窗口,无法与原先的窗口获取有效交互。

        解决方法:在画 #?????????的那一行,修改为tk.Toplevel(),tk.Toplevel()是和tk.Tk()有着相同方法的窗口,唯一的是,他是一个顶级的弹出类窗口。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值