从.txt文件读取列表并引用条目

0 投票
2 回答
48 浏览
提问于 2025-04-14 17:58

我刚开始学习编程,想用Python写一个卡牌游戏。

我遇到了一些问题:

  1. 我从一个.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()
  1. 我想这代码还有很多可以改进的地方,比如更有效地存储图片,或者根据.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 文件时动态创建卡片对象:

  1. 逐行读取文件内容,用 ',' 来分割每一行,然后获取第二个项目(也就是卡片的名字);
  2. 使用格式化字符串和卡片名字来创建一个 Image 对象;
  3. 用这个 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))

撰写回答