2015-12-31 9 views
3
from Tkinter import * 


class Ball: 
    def __init__(self, canvas, x1, y1, x2, y2): 
     self.x1 = x1 
     self.y1 = y1 
     self.x2 = x2 
     self.y2 = y2 
     self.canvas = canvas 
     self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red") 

# initialize root Window and canvas 
root = Tk() 
root.title("Balls") 
root.resizable(False, False) 
canvas = Canvas(root, width=300, height=300) 
canvas.pack() 

# create ball objects 
ball = Ball(canvas, 0, 0, 300, 300) 
root.mainloop() 

Как вы видите, я рисую 300 * 300 овалов в холсте 300 * 300, но овал не идеально подходит для полотна. Результат (Mac OS):Почему 300 * 300 Овал не может идеально подогнать 300 * 300 Canvas?

enter image description here

Так что мой вопрос:

  1. Почему это не подходит идеально?
  2. Что мне делать, чтобы избежать таких неудобных вещей?

EDIT:

ball = Ball(canvas, 1, 1, 299, 299) не работает, либо, это дает:

enter image description here

+1

Проблема в том, что координата (0,0) фактически находится под декоратором окна ОС. У Windows такая же проблема. Единственное «решение» - рисовать со смещением. –

+1

@ cricket_007: это не под «декоратором окон», это просто под собственной границей. –

+0

В Windows 10 с 3.5.1 (tk 8.6.4) 'Ball (canvas, 2, 2, 301, 301)' отлично работает. Я добавил 'bg = 'blue'' на вызов Canvas и лупу для проверки. Также см. Комментарий к ответу Оукли. –

ответ

3

вытяжке площадь холста по умолчанию меньше, чем общая ширина и высота холста. Общий размер включает границу виджета и кольцо выделения. Если вы хотите, чтобы область рисования была на 100% от ширины и высоты, вам необходимо установить как атрибуты borderwidth, так и highlightthickness холста в 0 (ноль).

+0

После этих изменений 0,0,300,300 (на «синем» холсте) отлично поработали - четыре края одинаковы. –

+0

Следуйте советам по созданию холста 'canvas = Canvas (root, width = 300, height = 300, borderwidth = 0, highlightthickness = 0)'. Оно работает. Большое спасибо! – Sayakiss

Смежные вопросы