Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python Tkinter:为列表框中的每个字符串创建一个变量?_Python 3.x_String_Variables_Tkinter_Listbox - Fatal编程技术网

Python 3.x Python Tkinter:为列表框中的每个字符串创建一个变量?

Python 3.x Python Tkinter:为列表框中的每个字符串创建一个变量?,python-3.x,string,variables,tkinter,listbox,Python 3.x,String,Variables,Tkinter,Listbox,我(几乎)是一个可怜的程序员处女,所以请对我宽容一点 这是我第二次尝试制作一个程序,结果恐怕有点超出了我的能力范围。经过长时间的努力,我请求你的帮助 我基本上是在做一个待办事项列表,但我希望它有更多的功能,而不仅仅是一个无聊的列表 我在脑海中的想象是,用户将任务添加到条目小部件中,然后在列表框中显示。然后列表框中的每个字符串都会有一个与之关联的值(我需要为我希望程序具有的功能进行一些计算)。 所以我想我想要的是列表框中的每个字符串都成为一个变量,然后与这个变量关联,我想要一个值 我将尝试向您展示

我(几乎)是一个可怜的程序员处女,所以请对我宽容一点

这是我第二次尝试制作一个程序,结果恐怕有点超出了我的能力范围。经过长时间的努力,我请求你的帮助

我基本上是在做一个待办事项列表,但我希望它有更多的功能,而不仅仅是一个无聊的列表

我在脑海中的想象是,用户将任务添加到条目小部件中,然后在列表框中显示。然后列表框中的每个字符串都会有一个与之关联的值(我需要为我希望程序具有的功能进行一些计算)。 所以我想我想要的是列表框中的每个字符串都成为一个变量,然后与这个变量关联,我想要一个值

我将尝试向您展示:

这里我添加了一个字符串,我想成为一个新变量

然后我从下拉菜单中指定一个数字。我希望这个数字是上一步中变量/字符串的值

我真的希望你们中的一位能够以一种(最好)不需要我改变太多的方式引导我走向正确的方向。事情对我来说仍然很棘手,而且对我来说导航代码已经相当困难了。 目的很简单,我想用(希望)与每个任务相关联的值进行一些计算。 如果你们有胆量的话,请提前感谢

相关代码如下所示:

import tkinter.messagebox # Import the messagebox module
import pickle # Module to save to .dat
import tkinter as tk

root = tk.Tk() #
root.title('SmaToDo') # Name of the program/window


def new_task():
    global entry_task
    global task_window
    task_window = Toplevel(root)
    task_window.title('Add a new task')
    task_label = tk.Label(task_window, text = 'Title your task concisely:', justify='center')
    task_label.pack()
    # Entry for tasks in new window
    entry_task = tkinter.Entry(task_window, width=50, justify='center')
    entry_task.pack()
    # Add task button in new window
    button_add_task = tkinter.Button(task_window, text='Add task', width=42, command=lambda: [add_task(), impact()])
    button_add_task.pack()

def add_task():
    global task
    global impact_window
    task = entry_task.get() # we get the task from entry_task and we get the input from the entry_task type-field with .get()
    if task != '': # If textbox inputfield is NOT empty do this:
        listbox_tasks.insert(tkinter.END, task)
        entry_task.delete(0, tkinter.END) # Slet hvad der står i inputfeltet fra første bogstav til sidste (0, tkinter.END)
        task_window.destroy()
    else:
        tkinter.messagebox.showwarning(title='Whoops', message='You must enter a task')
        task_window.destroy()


def delete_task():
    try:
        task_index = listbox_tasks.curselection()[0]
        listbox_tasks.delete(task_index)
    except:
        tkinter.messagebox.showwarning(title='Oops', message='You must select a task to delete')

def save_tasks():
    tasks = listbox_tasks.get(0, listbox_tasks.size())
    pickle.dump(tasks, open('tasks.dat', 'wb'))

def prioritize_tasks():
    pass



# Create UI
frame_tasks = tkinter.Frame(root)
frame_tasks.pack()

scrollbar_tasks = tkinter.Scrollbar(frame_tasks)
scrollbar_tasks.pack(side=tkinter.RIGHT, fill=tkinter.Y)

listbox_tasks = tkinter.Listbox(frame_tasks, height=10, width=50, justify='center') # tkinter.Listbox(where it should go, height=x, width=xx)
listbox_tasks.pack()

listbox_tasks.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listbox_tasks.yview)


try:
    tasks = pickle.load(open('tasks.dat', 'rb'))
    listbox_tasks.delete(0, tkinter.END)
    for task in tasks:
        listbox_tasks.insert(tkinter.END, task)
except:
    tkinter.messagebox.showwarning(title='Phew', message='You have no tasks')

# Add task button
button_new_task = tkinter.Button(root, text='New task', width=42, command=new_task)
button_new_task.pack()


button_delete_task = tkinter.Button(root, text='Delete task', width=42, command=delete_task)
button_delete_task.pack()


button_save_tasks = tkinter.Button(root, text='Save tasks', width=42, command=save_tasks)
button_save_tasks.pack()

button_prioritize_tasks = tkinter.Button(root, text='Prioritize', width=42, command=prioritize_tasks)
button_prioritize_tasks.pack()

root.mainloop() 


简单的方法是添加另一个
列表
,以存储影响值。您需要同步任务列表和影响列表

以下是修改后的代码:

导入pickle#模块以保存到.dat
将tkinter作为tk导入
从tkinter导入消息框
随机输入
任务\u FILE=“TASKS.dat”
任务影响=[]存储任务的影响
root=tk.tk()#
root.title('SmaToDo')#程序/窗口的名称
def impact():
#将随机影响分配给新任务
任务影响追加(random.randint(1,11))
定义新任务():
def add_task():
task=entry\u task.get().strip()
如果任务:
listbox_tasks.insert(tk.END,task)
影响()#获得任务的影响
其他:
messagebox.showwarning(title='Whoops',message='You must enter a task')
任务_window.destroy()
task\u window=tk.Toplevel(根)
任务\窗口标题('添加新任务')
task_label=tk.label(task_窗口,文本='Title your task简明:',justify='center')
task_label.pack()
#新窗口中的任务条目
entry\u task=tk.entry(任务窗口,宽度=50,居中对齐)
entry_task.pack()
#在新窗口中添加任务按钮
按钮添加任务=tk.button(任务窗口,text='addtask',width=42,command=addtask)
按钮添加任务包()
def delete_任务():
尝试:
task\u index=listbox\u tasks.curselection()[0]
listbox\u tasks.delete(task\u索引)
task_impact.pop(task_index)#同时删除相应的影响值
除:
messagebox.showwarning(title='Oops',message='您必须选择要删除的任务')
def load_任务():
尝试:
将打开的(任务_文件,'rb')作为f:
任务=pickle.load(f)
listbox_tasks.delete(0,tk.END)
任务_影响。清除()
对于任务,任务中的影响:
listbox_tasks.insert(tk.END,task)
任务\影响。附加(影响)
除:
messagebox.showwarning(title='Phew',message='You have no tasks')
def save_tasks():
tasks=zip(listbox\u tasks.get(0,tk.END),task\u影响)
将打开的(任务_文件,“wb”)作为f:
pickle.dump(任务,f)
def优先处理_任务():
打印(列表(zip(listbox\u tasks.get(0,tk.END),task\u影响)))
#创建用户界面
frame\u tasks=tk.frame(根)
frame_tasks.pack()
scrollbar\u tasks=tk.scrollbar(frame\u tasks)
滚动条_tasks.pack(side=tk.RIGHT,fill=tk.Y)
listbox_tasks=tk.listbox(frame_tasks,高度=10,宽度=50,justify='center')#tkinter.listbox(应该放在哪里,高度=x,宽度=xx)
listbox_tasks.pack()
listbox_tasks.config(yscrollcommand=scrollbar_tasks.set)
scrollbar\u tasks.config(命令=listbox\u tasks.yview)
#添加任务按钮
button\u new\u task=tk.按钮(根,text='new task',width=42,command=new\u task)
按钮\新任务\任务包()
button\u delete\u task=tk.按钮(根,text='delete task',宽度=42,命令=delete\u task)
按钮\删除\任务包()
按钮保存任务=tk.button(根,text='save tasks',width=42,command=save任务)
按钮\保存\任务。包()
button\u priority\u tasks=tk.button(根,text='priority',width=42,command=priority\u tasks)
按钮\u按任务的优先级排序。pack()
加载任务()
root.mainloop()
请注意,我有:

  • add_task()
    函数移到
    new_task()
    函数中,以避免使用全局变量
  • 创建缺少的
    impact()
    函数,为新任务分配随机影响值
  • 移动了在函数中加载保存的任务
    load\u tasks()


更好的建议是使用
ttk.Treeview()
而不是
tk.Listbox()
,因为您可以使用
标签或
Treeview中每个记录的
文本
选项将影响值与任务关联(这是一个不错的标题;)你没有提到这个问题,不过我相信我提到了。问题是,我不知道如何使列表框中的字符串变为具有各自值的变量—一个基于下拉列表中的字符串/整数的值。@KarimLoberg我有点困惑,但您可以尝试使用字典。所以基本上字典中的字符串是键,值是键的值