You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tkinter中实现国旗猜谜游戏的随机图片展示

国旗猜谜游戏图片显示问题解决方法

问题概述

开发国旗猜谜游戏,需求为点击难度关卡后随机展示对应国旗图片,用户输入国名猜测。尝试用os.listdir获取图片列表、os.system调用图片,但无法在游戏窗口内显示图片,需解决正确的图片调用方式。

原代码中尝试的无效片段:

path="flags"
files=os.listdir(path)
d=random.choice(files)
os.system(d)

错误原因

  1. 路径不完整:os.listdir(path)仅返回文件夹内的文件名,直接用os.system(d)会因路径缺失找不到文件,需拼接完整路径os.path.join(path, d)。
  2. 显示方式错误:os.system是调用系统默认程序打开图片,不会在tkinter的游戏窗口内渲染,必须用tkinter结合PIL库在窗口中直接显示图片。

修正后的完整代码

import tkinter as tk
import random
from PIL import ImageTk, Image
import os

window = tk.Tk()
window.title("Flags Guessing Game")
window.geometry("600x500")
bg = '#d9b9e2'
bg1 = '#b9e2df'
bg2 = '#e2b9d0'
bg3 = '#dbe2b9'
window.configure(background=bg)


def level_pick():
    ebtn = tk.Button(window, font=('Times', 30), command=easy_level)
    ebtn["bg"] = "#b6d6ff"
    ebtn["justify"] = "center"
    ebtn["text"] = "Easy"
    ebtn.place(x=10, y=170, width=282, height=145)

    mbtn = tk.Button(window, font=('Times', 30), command=medium_level)
    mbtn["bg"] = "#f9ffa8"
    mbtn["justify"] = "center"
    mbtn["text"] = "Medium"
    mbtn.place(x=310, y=170, width=277, height=145)

    hbtn = tk.Button(window, font=('Times', 30), command=hard_level)
    hbtn["bg"] = "#ffb3fc"
    hbtn["justify"] = "center"
    hbtn["text"] = "Hard"
    hbtn.place(x=150, y=330, width=282, height=145)

    diflbl = tk.Label(window, font=('Times', 20), bg=bg)
    diflbl["text"] = "Choose a difficulty:"
    diflbl["justify"] = "center"
    diflbl.place(x=160, y=100)

    titlelbl = tk.Label(window, font=('Times', 25), bg=bg)
    titlelbl["text"] = "Flag Guessing Game"
    titlelbl["justify"] = "center"
    titlelbl.place(x=110, y=40)


def load_random_flag(master, folder_path, size=(300, 200)):
    # 过滤文件夹内的图片文件
    files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
    if not files:
        tk.Label(master, text="No flags found!", bg=bg1).place(x=150, y=50)
        return
    
    random_file = random.choice(files)
    full_path = os.path.join(folder_path, random_file)
    
    # 打开并缩放图片适配窗口
    img = Image.open(full_path)
    img = img.resize(size, Image.Resampling.LANCZOS)
    tk_img = ImageTk.PhotoImage(img)
    
    # 在窗口中显示图片
    img_label = tk.Label(master, image=tk_img, bg=bg1)
    img_label.place(x=150, y=50)
    # 保留图片引用,防止被垃圾回收导致图片消失
    img_label.image = tk_img
    
    # 返回无后缀的文件名,用于后续验证用户答案
    return os.path.splitext(random_file)[0]


def easy_level():
    new = tk.Toplevel(window)
    new.title("Easy Mode")
    new.configure(background=bg1)
    new.geometry("600x500")
    
    ans = tk.Entry(new, font=('Times', 25))
    ans["justify"] = "center"
    ans["borderwidth"] = "1px"
    ans.place(x=90, y=270, width=414, height=188)

    rules1 = tk.Label(new, font=('Times', 20), bg=bg1)
    rules1["text"] = "Enter Country Name Here:"
    rules1["justify"] = "center"
    rules1.place(x=110, y=230)
    
    # 加载并显示随机国旗,存储正确国名用于验证
    correct_country = load_random_flag(new, "flags")


def medium_level():
    new = tk.Toplevel(window)
    new.title("Medium Mode")
    new.configure(background=bg2)
    new.geometry("600x500")
    
    ans = tk.Entry(new, font=('Times', 25))
    ans["justify"] = "center"
    ans["borderwidth"] = "1px"
    ans.place(x=90, y=270, width=414, height=188)

    rules2 = tk.Label(new, font=('Times', 20), bg=bg2)
    rules2["text"] = "Enter Country Name Here:"
    rules2["justify"] = "center"
    rules2.place(x=110, y=230)
    
    # 加载中等难度文件夹内的国旗
    correct_country = load_random_flag(new, "flags/medium")


def hard_level():
    new = tk.Toplevel(window)
    new.title("Hard Mode")
    new.configure(background=bg3)
    new.geometry("600x500")
    
    ans = tk.Entry(new, font=('Times', 25))
    ans["justify"] = "center"
    ans["borderwidth"] = "1px"
    ans.place(x=90, y=270, width=414, height=188)

    rules3 = tk.Label(new, font=('Times', 20), bg=bg3)
    rules3["text"] = "Enter Country Name Here:"
    rules3["justify"] = "center"
    rules3.place(x=110, y=230)
    
    # 加载困难难度文件夹内的国旗
    correct_country = load_random_flag(new, "flags/hard")


level_pick()
tk.mainloop()

关键说明

  • 路径处理:用os.path.join拼接文件夹与文件名,避免因操作系统路径分隔符差异导致的文件找不到问题。
  • 图片渲染:通过PIL库加载、缩放图片,转为tkinter兼容的格式后,用Label组件在游戏窗口内显示。
  • 引用保留:必须将图片对象赋值给Label的image属性,否则Python垃圾回收会销毁图片资源,导致窗口中图片消失。
  • 难度区分:建议为不同难度创建独立文件夹(如flags/easy),在对应关卡加载对应文件夹的图片,更贴合需求逻辑。

内容的提问来源于stack exchange,提问作者jjk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:37:04