【问题标题】:canvas command not working inside function画布命令在函数内部不起作用
【发布时间】:2017-12-20 21:19:34
【问题描述】:

帮助!我正在使用 python 3.5.2 并且函数 self.new_game 不起作用。它应该将文本放在画布上,但它什么也没做! shell中也没有出现错误。

from tkinter import *
import time
import os

WIDTH = 1920
HEIGHT = 1080
root = Tk()
root.state('zoomed')
planet_selected = 0
planet_name = "nothing"
planet_temp = -270
planet_size = 0.0
planet_life = 0.0

class Space(Frame):
    def __init__(self):
        Frame.__init__(self)
        frame1 = Frame(self)
        self.canvas = Canvas(frame1, width = WIDTH, height = HEIGHT, bg ="white")
        self.canvas.focus_set()
        self.canvas.create_text(1920,1000,text='Planetary Creator',font=('Arial',15))
        self.master.title("Planetary Creator Alpha 0.1")
        frame = Frame(root, bg='grey', width=1920, height=40)
        frame.pack(fill='x')
        button1 = Button(frame, text='New Game',command=lambda : self.new_game())
        button1.pack(side='left', padx=10)
        button2 = Button(frame, text='Quit Game',command=lambda : os._exit(0))
        button2.pack(side='left')

#this function below does not work!!!

    def new_game(self):
        self.canvas.delete(ALL)
        size = self.canvas.create_text(960,540,text=str(planet_size) + "moon",font=("Arial",10))
        life = self.canvas.create_text(960,520,text="✣" + str(planet_life) + "%",font=("Arial",10))
        temp = self.canvas.create_text(960,500,text=str(planet_temp) + "°C",font=("Arial",10))
        name = self.canvas.create_text(960,480,text=planet_name,font=("Arial",15))

Space().mainloop()

【问题讨论】:

  • 您没有布局多个小部件。您需要将self.pack()self.canvas.pack()frame1.pack() 添加到您的__init__ 方法中。
  • self.pack() 应该放在哪里
  • 所有这些都进入Space.__init__
  • 执行 self.pack() 会使我的面板和按钮消失
  • 我通常想从父级调用那些布局管理器,但不确定它是否是正确的方法。

标签: python python-3.x canvas tkinter


【解决方案1】:

我删除了 frame1 并将 Canvas 放入 root ,并使用 canvas.pack() 在窗口中查看画布。
(但我可以使用self 代替root 并使用self.pack(),因为Space 继承自Frame。这将更符合逻辑)

之后我只需要更改文本位置,因为窗口对于我的屏幕来说太大了。

我使用变量CENTER_XCENTER_Y 将文本置于中心位置,而不管屏幕大小。

from tkinter import *
import time
import os

class Space(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)

        self.master.title("Planetary Creator Alpha 0.1")

        self.canvas = Canvas(root, width=WIDTH, height=HEIGHT, bg="white")
        self.canvas.pack()
        self.canvas.focus_set()

        self.canvas.create_text(CENTER_X, CENTER_Y, text='Planetary Creator', font=('Arial',15))

        frame = Frame(root, bg='grey', width=WIDTH, height=40)
        frame.pack(fill='x')

        button1 = Button(frame, text='New Game', command=self.new_game)
        button1.pack(side='left', padx=10)

        button2 = Button(frame, text='Quit Game', command=root.destroy)
        button2.pack(side='left')

    def new_game(self):
        self.canvas.delete(ALL)

        size = self.canvas.create_text(CENTER_X, CENTER_Y, text=str(planet_size) + "moon", font=("Arial",10))
        life = self.canvas.create_text(CENTER_X, CENTER_Y-20, text="✣" + str(planet_life) + "%", font=("Arial",10))
        temp = self.canvas.create_text(CENTER_X, CENTER_Y-40, text=str(planet_temp) + "°C", font=("Arial",10))
        name = self.canvas.create_text(CENTER_X, CENTER_Y-60, text=planet_name, font=("Arial",15))

# --- main ---

WIDTH = 800 #1920
HEIGHT = 500 #1080

CENTER_X = WIDTH//2
CENTER_Y = HEIGHT//2

planet_selected = 0
planet_name = "nothing"
planet_temp = -270
planet_size = 0.0
planet_life = 0.0

root = Tk()
#root.state('zoomed')
Space(root)
root.mainloop()

【讨论】:

  • 为什么要继承 Frame?
  • @Novel 我保留了原始代码,但我正在考虑更改它。最后我只写了我可以使用self而不是root等,因为这样更合乎逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多