tcmfans 2022-05-11 11:51 采纳率: 66.7%
浏览 23
已结题

用tkinter制作填空项目,为什么本来应该各自独立的空格却显示同样的内容?

我需要实现这个功能:当在空格填入任何内容后,自动把空格的内容更新到一个字典里。
我用面向编程思路编写,运行正常,达到我的目的。
from tkinter import *
from tkinter.ttk import *

# 新建窗口
root = Tk()

# 默认数据
name = '张三'
age = '40'
record = {'姓名': name, '年龄': age}


def refresh_name(self, *args):
    '''
    更新字典里的名字
    '''
    record['姓名'] = content_name.get()
    print(record)

def refresh_age(self, *args):
    '''
    更新字典里的年龄
    '''
    record['年龄'] = content_age.get()
    print(record)

# 新建姓名标签与空格
Label(root, text='姓名').grid(pady=10, row = 1, column = 1, sticky = E)
content_name = StringVar()
content_name.set(record['姓名'])
content_name_blk = Entry(root, textvariable = content_name, width = 10)
content_name_blk.grid(pady=10, row = 1, column = 2, sticky = W)
content_name_blk.bind('<KeyRelease>', refresh_name)  # 当输入文字后更新字典

# 新建年龄标签与空格
Label(root, text='年龄').grid(pady=10, row = 1, column = 3, sticky = E)
content_age = StringVar()
content_age.set(record['年龄'])
content_age_blk = Entry(root, textvariable = content_age, width = 10)
content_age_blk.grid(pady=10, row = 1, column = 4, sticky = W)
content_age_blk.bind('<KeyRelease>', refresh_age)  # 当输入文字后更新字典


root.mainloop()
但是当我用面向对象思路编写后,2个空格的内容居然同步了,而且当我在其中一个空格填写时,另外一个空格也跟着一起刷新相同的内容。
from tkinter import *
from tkinter.ttk import *

# 新建窗口
root = Tk()

# 默认数据
name = '张三'
age = '40'
record = {'姓名': name, '年龄': age}


class Blank:
    '''
    新建填空类,由标签和空格2部分组成。功能:每输入一个字,自动更新record字典。
    '''
    def __init__(self, name, row, column, content = StringVar()):
        self.name = name  # 标签名
        self.row = row
        self.column = column
        Label(root, text=self.name).grid(pady=10, row = self.row, column = self.column, sticky = E)  # 新建标签
        self.content = content
        self.content.set(record[self.name])  # 根据record字典填入空格内容
        a = Entry(root, textvariable = self.content, width = 10)  # 新建空格,自动填写空格内容
        a.grid(pady=10, row = self.row, column = self.column + 1, sticky = W)
        a.bind('<KeyRelease>', self.refresh)  # 当输入文字后更新字典
    def refresh(self, *args):
        '''
        更新字典
        '''
        record[self.name] = self.content.get()
        print(record)


name_blk = Blank('姓名', 1, 1)
age_blk = Blank('年龄', 1, 3)


root.mainloop()

Blank类生成的对象应该是独立的,为什么空格显示的内容会同步,而字典里却又按照各自的不同变量显示呢?
  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-05-11 13:17
    关注

    因为在Blank类的初始化函数里,content = StringVar() 相当于是一个常量,每个Blank实例如果不指定content实参,都会默认指向同一个StringVar实例。
    如果你在传参的时候创建StringVar()实例就没这个问题了。

    name_blk = Blank('姓名', 1, 1,StringVar())
    age_blk = Blank('年龄', 1, 3,StringVar())
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 创建了问题 5月11日

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端