【问题标题】:python tkinter read only entrypython tkinter 只读条目
【发布时间】:2017-11-04 16:55:44
【问题描述】:

我是计算机科学一年级的学生,只学习了 2 个月的 Python。我目前正在处理我的任务,这需要我创建一个 tkinter GUI。 我用过:

from tkinter import*
def conselect(evt):
    value=str((lstName.get(lstName.curselection())))
    infile=open("list.txt",'r')
    for line in infile:
        data=line.split(',')
        if line.startswith(value):
            print(data[1])
    infile.close()
window=Tk()
window.title("Countries")
lstName=Listbox(window,width=100,height=100)
yscroll=Scrollbar(command=lstName.yview)
yscroll.grid(row=0,column=3,sticky=NS,rowspan=3)
lstName=Listbox(window,width=15,height=10,yscrollcommand=yscroll.set)
lstName.grid(row=0,padx=0,pady=0,sticky=W,columnspan=2,rowspan=3)
yscroll.config(command=lstName.yview)
continent=[]
lstName.bind('<<ListboxSelect>>',conselect)

infile=open("list.txt",'r')
for line in infile:
    data=line.split(',')
    countryName=data[0]
    lstName.insert('end',countryName)
infile.close()
labelC=Label(window,text="Continent :")
labelC.grid(padx=5,pady=0,row=0,column=4,sticky=W)
labelC=Label(window,text="Population :")
labelC.grid(padx=5,pady=0,row=1,column=4,sticky=W)
labelC=Label(window,text="Area :")
labelC.grid(padx=5,pady=0,row=2,column=4,sticky=W)

entOutput=Entry(window,width=10,state="readonly")
entOutput.grid(padx=5,pady=0,row=0,column=5)
entOutput=Entry(window,width=10,state="readonly")
entOutput.grid(padx=5,pady=0,row=1,column=5)
entOutput=Entry(window,width=10,state="readonly")
entOutput.grid(padx=5,pady=0,row=2,column=5)

如何在代码末尾将我的 conselect(evt) 输出打印到入口小部件

【问题讨论】:

  • 嗨。欢迎来到堆栈溢出。我有点困惑。您是要尝试将 entry 小部件中的字符串替换为来自 data(1) 的结果,还是要尝试将结果打印到文本框小部件?
  • 我正在尝试将结果打印到条目小部件...
  • 我提供了一个将字符串打印到条目或文本框的答案。看看我的回答,如果有帮助,请告诉我。
  • 我试图在我的 GUI 上拥有一个列表框和另一个条目小部件,以便当用户单击列表框上的某些内容时,条目小部件将打印出另一个数据。例如,当我单击列表框上的 A 时,条目小部件应打印 1。
  • 在我的文本文件中,它类似于 A、1 B、2 C、3 等,所以我不确定如何将数据 [1] 转换为字符串,以便我可以使用您的方法输入

标签: python-3.x tkinter


【解决方案1】:

更新:

阅读您更新的问题后,我查看了代码并进行了一些更改。我将在下面的代码中对其进行分解。

因为您没有提供文本文件的可测试示例,所以我必须使用我认为您正在使用的信息创建自己的示例。

该文件由json 读取,是一个列表列表。以下是该文件的内容:

[
["test 1", "Neverland", "9,000,000", "1000 SQ Miles"],
["test 2", "Ashgard", "1,000,000", "100 SQ Miles"],
["test 3", "Bacon Nation", "3,000,000", "400 SQ Miles"],
["test 4", "Lolzville", "22,000,000", "10000 SQ Miles"]
]

我添加了一个新的导入 json。这将是我所做的其他一些更改所必需的。

from tkinter import *
import json

window=Tk()
window.title("Countries")

lstName=Listbox(window,width=100,height=100)
yscroll=Scrollbar(command=lstName.yview)
yscroll.grid(row=0,column=3,sticky=NS,rowspan=3)
lstName=Listbox(window,width=15,height=10,yscrollcommand=yscroll.set)
lstName.grid(row=0,padx=0,pady=0,sticky=W,columnspan=2,rowspan=3)
yscroll.config(command=lstName.yview)

labelC=Label(window,text="Continent :")
labelC.grid(padx=5,pady=0,row=0,column=4,sticky=W)
labelC=Label(window,text="Population :")
labelC.grid(padx=5,pady=0,row=1,column=4,sticky=W)
labelC=Label(window,text="Area :")
labelC.grid(padx=5,pady=0,row=2,column=4,sticky=W)

在这里,我必须更改 Entry 小部件名称,以便能够针对每个小部件进行后续配置。

entOutput=Entry(window,width=10,state="readonly")
entOutput.grid(padx=5,pady=0,row=0,column=5)
entOutput2=Entry(window,width=10,state="readonly")
entOutput2.grid(padx=5,pady=0,row=1,column=5)
entOutput3=Entry(window,width=10,state="readonly")
entOutput3.grid(padx=5,pady=0,row=2,column=5)

我将我们打开文件的方式更改为使用with open 这将为我们处理文件关闭。我们也可以以类似于with open 语句中的函数的方式执行所有我们需要的东西。我们在这里所做的是将 list.text 文件的内容作为一个名为 loaded_list 的变量加载到全局命名空间中。这将用于程序的其余部分。

with open("list.txt",'r') as l:
    loaded_list = json.load(l)
    for line in loaded_list:
        countryName=line[0]
        lstName.insert('end',countryName)

这里我们获取从curselection 返回的元组中的第一个值,并使用它来识别我们之前创建的loaded_list 变量内正确列表的索引。对于每个输入字段,我们必须将其状态更改为正常,对输入字段进行更新,然后将状态更改回“只读”。通过这种方式,所有 3 个字段都可以使用相应字段的预定义索引进行更新。

def conselect(evt):
    value = lstName.curselection()[0]
    templist = loaded_list[value]

    entOutput.config(state = NORMAL)
    entOutput.delete(0, END)
    entOutput.insert(0, templist[1])
    entOutput.config(state = "readonly")

    entOutput2.config(state = NORMAL)
    entOutput2.delete(0, END)
    entOutput2.insert(0, templist[2])
    entOutput2.config(state = "readonly")

    entOutput3.config(state = NORMAL)
    entOutput3.delete(0, END)
    entOutput3.insert(0, templist[3])
    entOutput3.config(state = "readonly")

lstName.bind('<<ListboxSelect>>',conselect)


window.mainloop()

这是它如何工作的图片:

这里是完整的代码供你复制:

from tkinter import *
import json

window=Tk()
window.title("Countries")

lstName=Listbox(window,width=100,height=100)
yscroll=Scrollbar(command=lstName.yview)
yscroll.grid(row=0,column=3,sticky=NS,rowspan=3)
lstName=Listbox(window,width=15,height=10,yscrollcommand=yscroll.set)
lstName.grid(row=0,padx=0,pady=0,sticky=W,columnspan=2,rowspan=3)
yscroll.config(command=lstName.yview)

labelC=Label(window,text="Continent :")
labelC.grid(padx=5,pady=0,row=0,column=4,sticky=W)
labelC=Label(window,text="Population :")
labelC.grid(padx=5,pady=0,row=1,column=4,sticky=W)
labelC=Label(window,text="Area :")
labelC.grid(padx=5,pady=0,row=2,column=4,sticky=W)

entOutput=Entry(window,width=10,state="readonly")
entOutput.grid(padx=5,pady=0,row=0,column=5)
entOutput2=Entry(window,width=10,state="readonly")
entOutput2.grid(padx=5,pady=0,row=1,column=5)
entOutput3=Entry(window,width=10,state="readonly")
entOutput3.grid(padx=5,pady=0,row=2,column=5)

with open("list.txt",'r') as l:
    loaded_list = json.load(l)
    for line in loaded_list:
        countryName=line[0]
        lstName.insert('end',countryName)

def conselect(evt):
    value = lstName.curselection()[0]
    templist = loaded_list[value]

    entOutput.config(state = NORMAL)
    entOutput.delete(0, END)
    entOutput.insert(0, templist[1])
    entOutput.config(state = "readonly")

    entOutput2.config(state = NORMAL)
    entOutput2.delete(0, END)
    entOutput2.insert(0, templist[2])
    entOutput2.config(state = "readonly")

    entOutput3.config(state = NORMAL)
    entOutput3.delete(

0, END)
    entOutput3.insert(0, templist[3])
    entOutput3.config(state = "readonly")

lstName.bind('<<ListboxSelect>>',conselect)


window.mainloop()

【讨论】:

  • 嗨。感谢您的回复如何在列表框小部件而不是按钮上进行选择?我试图在我的 GUI 上有一个列表框和另一个条目小部件,以便当用户单击列表框上的某些内容时,条目小部件将打印出另一个数据。例如,当我单击列表框上的 A 时,条目小部件应打印 1。
  • @Bee Jian Sheng:很可能使用列表框,但是这与您提出的问题不同。在继续讨论新问题之前,让我们完成并解决这个问题。另外,为了让我解决您在 cmets 中提到的问题,我需要查看更多代码。
  • @Bee Jian Sheng:好的,我更改了答案以反映您更新的问题。让我知道它是否有帮助。注意我必须创建自己的文本文件,其中包含我认为您会使用的字段,因为您没有提供文本文件的完整示例。但是我相信这对你来说应该是一个很好的答案。
  • 谢谢!塞拉山科技。 'json' 对我来说是一个新功能。我会在网上搜索它的教程。非常感谢你的帮助。它肯定有很大帮助。我已经在这部分停留了几个星期。 =)
  • @Bee Jian Sheng:你会发现很多有用的 Python 库。很高兴我能帮上忙。
【解决方案2】:

要使您的文本框只读,您可以尝试使用配置文本框元素

text.config(state=DISABLED)

【讨论】:

  • OP 的问题是如何在小部件中做出响应,而不是如何禁用小部件。
  • 我正在尝试将结果打印到条目小部件...我试图在我的 GUI 上拥有一个列表框和另一个条目小部件,以便当用户单击列表框上的某些内容时,条目小部件将打印出另一个数据。例如,当我单击列表框上的 A 时,条目小部件应打印 1。
  • 谢谢老兄
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 2014-03-24
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2017-10-19
  • 1970-01-01
相关资源
最近更新 更多