python - 使用 rowspan 在 tkinter 中画布未正确排列
问题描述
我在 python 中有一些代码,主要使用库 tkinter 进行 Hangman 游戏:
from tkinter import *
from PIL import ImageTk, Image
import time
pause=500
class Graphics(Canvas):
pics = {
'1':'backgrounds/step1.png',
'2':'backgrounds/step2.png',
'3':'backgrounds/step3.png',
'4':'backgrounds/step4.png',
'5':'backgrounds/step5.png',
'6':'backgrounds/step6.png',
'7':'backgrounds/step7.png',
'8':'backgrounds/step8.png',
'9':'backgrounds/step9.png',
'10':'backgrounds/step10.png',
'11':'backgrounds/step11.png',
'12':'backgrounds/step12.png'
}
def __init__(self, master):
self.width=500
self.height=550
Canvas.__init__(self, master, bg='saddle brown', width=self.width, height=self.height, highlightthickness=0)
# self.step = '1'
# self.createImage(self.step)
def createImage(self,picName,size=()):
if size==():
size=(self.width,self.height)
filename = self.pics[picName]
self.im = Image.open(filename)
self.resizePic(size)
self.img=ImageTk.PhotoImage(self.im)
self.pic = self.create_image(self.width/2,self.height/2,anchor=CENTER,\
image=self.img)
def resizePic(self,size):
self.im = self.im.resize(size,Image.ANTIALIAS)
def nextStep(self):
if self.step=='6':
self.after(pause, self.master.welcome)
return
self.step = str(int(self.step)+1)
self.delete(self.pic)
self.createImage(self.step)
self.after(pause, self.nextStep)
class TEXT(Canvas):
def __init__(self, master, width, height, text):
Canvas.__init__(self, bg='black',width=width,height=height,highlightthickness=0)
self.text = self.create_text(width/2,height/2,anchor = "center", text=text, fill='white', font = ("Arial", 24))
class Hangman(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.graphics = Graphics(self)
self.graphics.grid(row=0,column=0,rowspan=10)
# self.after(pause, self.graphics.nextStep)
self.after(pause, self.welcome)
def welcome(self):
self.welc = TEXT(self, 500, 55*3, "Welcome")
self.welc.grid(row=0,column=1,rowspan=3)
self.after(pause, self.to)
def to(self):
self.Hto = TEXT(self, 500, 55*3, "to")
self.Hto.grid(row=3,column=1,rowspan=3)
self.after(pause, self.hman)
def hman(self):
self.Hman = TEXT(self, 500, 55*4, "HANGMAN!")
self.Hman.grid(row=6,column=1,rowspan=4)
def removeWELC(self):
self.delete(self.welcome)
# self.delete(self.)
def play_hangman():
root = Tk()
root.title='Hangman'
game = Hangman(root)
root.mainloop()
play_hangman()
就我的问题而言,不需要图片。无论如何,我希望在 1/2 秒的停顿后出现“欢迎”“到”“刽子手”这些词。时机和一切都是正确的。
然而,三个 Canvas 并没有在“棕色矩形”旁边正确排列,其中一个奇怪地居中在它的右侧,另外两个在它下方。为什么会这样?
解决方案
这是因为您忘记分配master
给Canvas.__init__(...)
内部TEXT.__init__()
功能。
更改如下:
class TEXT(Canvas):
def __init__(self, master, width, height, text):
Canvas.__init__(self, bg='black',width=width,height=height,highlightthickness=0)
至:
class TEXT(Canvas):
def __init__(self, master, width, height, text):
Canvas.__init__(self, master, bg='black',width=width,height=height,highlightthickness=0)
推荐阅读
- python - 如何对 Django 中的所有模型对象进行反向关系查找?
- python - Pandas,TypeError:需要一个整数(获取类型 str)
- ios - Flutter - FileSystemException:无法在 ios 上打开文件,path = '/path'(操作系统错误:不允许操作,errno = 1)
- amazon-web-services - AWS S3 操作策略 CLI 与控制台将对象粘贴到一个存储桶中
- javascript - 从这个 google 地方 API 地址结果中提取地址片段的最佳方法是什么?
- python-3.x - 如何使用用户输入将多个项目附加到列表中而不覆盖列表中已有的项目?
- javascript - Google Chrome Windows/iOS 桌面通知
- php - Laravel 排序错误
- python - 您如何使用面向对象编程在 Python 中对龟兔赛跑进行编程,更具体地说,我们如何让它们实际移动?
- json - 对 jq 中的值运行终端操作