从.txt文件读取列表并引用条目
我刚开始学习编程,想用Python写一个卡牌游戏。
我遇到了一些问题:
- 我从一个.txt文件中读取卡牌列表,格式是这样的:
2,Card001,1
2,Card002,2
2,Card003,3
我想根据这个卡牌列表在tkinter中显示图片。
我主要的问题是,读取后得到的列表里,卡牌名字是以字符串的形式存在的。我不知道怎么把这个字符串转换成可以引用的形式,以便显示相关的图片。
这是我“简化”后的代码:
import csv
import tkinter as tk
from PIL import ImageTk,Image
import random
### CREATING GUI:
root = tk.Tk()
root.geometry("1260x700")
root.resizable(width=True, height=False)
root.title("RandomCards")
### READING IN TXT-FILE:
col_names = ("Quantity", "Card Name", "Value")
with open("deck_list.txt", "r", newline="") as decklist:
reader = csv.reader(decklist)
data = list(reader)
### CREATING DECK:
deck = []
for i, row in enumerate(data, start=4):
if row[0]=='1':
deck.append(row[1])
if row[0]=='2':
deck.append(row[1])
deck.append(row[1])
if row[0]=='3':
deck.append(row[1])
deck.append(row[1])
deck.append(row[1])
### STORING IMAGES:
img_Card001 = Image.open("C:/Users/DFeldmann/Card001.webp")
Card001 = ImageTk.PhotoImage(img_Card001)
img_Card002 = Image.open("C:/Users/DFeldmann/Card002.webp")
Card002 = ImageTk.PhotoImage(img_Card002)
img_Card003 = Image.open("C:/Users/DFeldmann/Card003.webp")
Card003 = ImageTk.PhotoImage(img_Card003)
#### >>> This is how >deck< should look like:
#### deck = [Card001, Card001, Card002, Card002, Card003, Card003]
hand_size = 4
def draw_hand():
for i in range(hand_size):
draw = deck[random.randint(0,len(deck)-1)]
deck.remove(draw)
hand.append(draw)
hand = []
draw_hand()
print(hand)
### CREATING HAND SLOTS:
button = tk.Button(root, image=hand[0])
button.grid(row=1, column=1)
button = tk.Button(root, image=hand[1])
button.grid(row=1, column=2)
button = tk.Button(root, image=hand[2])
button.grid(row=1, column=3)
button = tk.Button(root, image=hand[3])
button.grid(row=1, column=4)
root.mainloop()
- 我想这代码还有很多可以改进的地方,比如更有效地存储图片,或者根据.txt文件中给定的卡牌数量来创建卡牌列表。
总的来说,如果我手动创建卡牌列表,这段代码是可以工作的,因为那样的卡牌是以对象的形式存在的,而不是字符串。
deck = [Card001, Card001, Card002, Card002, Card003, Card003]
我尝试搜索其他相关话题,但因为我对编程还很陌生,不太理解很多术语,所以很难找到这个具体问题的解决办法。
2 个回答
-1
如果你想动态地制作一组图片,可以按照下面的方式来做:
image_deck = []
for card_name in deck:
card_image_obj = Image.open(f"C:/Users/DFeldmann/{card_name}.webp")
image_deck.append(ImageTk.PhotoImage(card_image_obj))
这里你需要再声明一个新的列表,这样旧的列表才能继续使用,而不会被覆盖。我在这里用了Python的f-string来动态生成路径。
我遍历了图片列表,并从中创建了一个新的列表,这个新列表里包含了图片对象。
0
你可以在读取 .txt
文件时动态创建卡片对象:
- 逐行读取文件内容,用
','
来分割每一行,然后获取第二个项目(也就是卡片的名字); - 使用格式化字符串和卡片名字来创建一个
Image
对象; - 用这个
Image
对象创建一个ImageTk.PhotoImage
,并把它添加到一个叫deck
的列表里。
deck = []
with open("deck_list.txt", "r") as f:
for line in f:
card_name = line.split(",")[1]
img_card = Image.open(f"C:/Users/DFeldmann/{card_name}.webp")
deck.append(ImageTk.PhotoImage(img_card))