{"id":1543,"date":"2020-07-10T00:00:54","date_gmt":"2020-07-09T15:00:54","guid":{"rendered":"https:\/\/www.ishikawasekkei.com\/?p=1543"},"modified":"2020-07-09T23:35:53","modified_gmt":"2020-07-09T14:35:53","slug":"python-tkinter-gui-programing-canvas-move4","status":"publish","type":"post","link":"https:\/\/www.ishikawasekkei.com\/index.php\/2020\/07\/10\/python-tkinter-gui-programing-canvas-move4\/","title":{"rendered":"Python tkinter GUI\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0 Canvas move4"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u3000\u4eca\u65e5\u3082\u6765\u3066\u304f\u3060\u3055\u3063\u3066\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3059\u3002\u77f3\u5ddd\u3055\u3093\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000\u3057\u3064\u3053\u304fCanvas\u306e\u79fb\u52d5\u306b\u3064\u3044\u3066\u3084\u3063\u3066\u307f\u307e\u3057\u305f\u3002\u524d\u56de\u79fb\u52d5\u3059\u308b\u305f\u3081\u306e\u30af\u30e9\u30b9\u3092\u4f5c\u3063\u305f\u3068\u304d\u306b\u3001\u79fb\u52d5\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u30af\u30e9\u30b9\u5074\u306b\u4f5c\u3063\u305f\u3051\u3069\u3001\u547c\u3073\u51fa\u3057\u306f\u30e1\u30a4\u30f3\u30af\u30e9\u30b9\u306e\u65b9\u304b\u3089\u547c\u3073\u51fa\u3057\u3066\u3044\u3066\u3001\u305d\u308c\u304c\u3061\u3087\u3063\u3068\u6c17\u306b\u5165\u3089\u306a\u304b\u3063\u305f\u306e\u3067\u3059\u304c\u3001\u89e3\u6c7a\u3067\u304d\u305f\u306e\u3067\u3001\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u3067\u304d\u3042\u304c\u308a\u30a4\u30e1\u30fc\u30b8<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"721\" src=\"https:\/\/www.ishikawasekkei.com\/wp-content\/uploads\/2020\/07\/image-2-1024x721.png\" alt=\"\" class=\"wp-image-1546\" srcset=\"https:\/\/www.ishikawasekkei.com\/wp-content\/uploads\/2020\/07\/image-2-1024x721.png 1024w, https:\/\/www.ishikawasekkei.com\/wp-content\/uploads\/2020\/07\/image-2-300x211.png 300w, https:\/\/www.ishikawasekkei.com\/wp-content\/uploads\/2020\/07\/image-2-768x541.png 768w, https:\/\/www.ishikawasekkei.com\/wp-content\/uploads\/2020\/07\/image-2.png 1202w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000\u3067\u304d\u3042\u304c\u308a\u30a4\u30e1\u30fc\u30b8\u306f\u524d\u56de\u3068\u540c\u3058\u3067\u3059\u3002\u6a5f\u80fd\u7684\u306b\u306f\u307b\u3068\u3093\u3069\u540c\u3058\u3067\u3059\u304c\u3001\u30a4\u30d9\u30f3\u30c8\u306e\u51e6\u7406\u304c\u30af\u30e9\u30b9\u306b\u5206\u96e2\u3067\u304d\u305f\u3068\u3053\u308d\u304c\u7570\u306a\u308a\u307e\u3059\u3002\u307e\u3001\u898b\u305f\u76ee\u306f\u307e\u3063\u305f\u304f\u540c\u3058\u306a\u306e\u3067\u3059\u3051\u3069\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import tkinter as tk\n\n\nclass App(tk.Tk):\n    def __init__(self):\n        super().__init__()\n        self.title(\"Canvas move with class\")\n        self.geometry(\"1200x800\")\n\n        self.canvas = tk.Canvas(self, background=\"white\")\n\n        self.canvas.grid(row=0, column=0, sticky=tk.NSEW)\n        self.rowconfigure(0, weight=1)\n        self.columnconfigure(0, weight=1)\n\n        self.canvas.bind(\"&lt;Button-1>\", self.button1)\n\n        self.canvas.movers = [Movable(self.canvas, 160, 160, \"AliceBlue\"),\n                              Movable(self.canvas, 200, 200, \"LightYellow\")]\n\n    def button1(self, event):\n        item = self.canvas.find_overlapping(event.x, event.y, event.x, event.y)\n        if item:\n            return\n        m = Movable(self.canvas, event.x, event.y, \"Red\")\n        self.canvas.movers.append(m)\n\nclass Movable():\n    BOXID = 0\n    def __init__(self, canvas, x, y, color):\n        self.canvas = c = canvas\n        global BOXID\n        BOXID += 1\n        self.tag = t = \"MOVABLE-\" + str(BOXID)\n        self.t_id = c.create_text(x, y, text=color, tag=t)\n        self.r_id = c.create_rectangle(c.bbox(self.t_id), fill=color, tag=t)\n        c.tag_lower(self.r_id, self.t_id)\n        self.start = None\n        c.tag_bind(t, \"&lt;Button-1>\", self.button1)\n        c.tag_bind(t, \"&lt;Motion>\", self.move)\n        c.tag_bind(t, \"&lt;ButtonRelease>\", self.button_release)\n        c.tag_bind(t, \"&lt;Button-3>\", self.remove)\n\n     def move(self, event):\n        if self.start is None:\n            return\n        x, y = self.canvas.canvasx(event.x), self.canvas.canvasy(event.y)\n        dx, dy = x - self.start[0], y - self.start[1]\n        self.canvas.move(self.tag, dx, dy)\n        self.start = x, y\n\n    def button1(self, event):\n        x, y = self.canvas.canvasx(event.x), self.canvas.canvasy(event.y)\n        self.start = x, y\n\n    def button_release(self, event):\n        self.start = None\n\n    def remove(self, event):\n        c = self.canvas\n        c.tag_unbind(self.tag, \"\")\n        c.delete(self.tag)\n        c.movers.remove(self)\n\n\nif __name__ == \"__main__\":\n    app = App()\n    app.mainloop()<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u8aac\u660e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000\u6700\u521d\u306e\u9055\u3044\u306f\u3001\u30a4\u30d9\u30f3\u30c8\u3092\u30d0\u30a4\u30f3\u30c9\u3057\u3066\u3044\u308b16\u884c\u76ee\u3067\u3059\u3002\u30af\u30ea\u30c3\u30af\u3057\u305f\u3068\u304d\u306e\u30a4\u30d9\u30f3\u30c8\u3067\u3059\u304c\u3001\u3053\u308c\u306f\u3001Canvas\u3092\u30af\u30ea\u30c3\u30af\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u3092\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u3082\u306e\u3067\u3059\u3002\u30af\u30ea\u30c3\u30af\u3057\u305f\u3068\u3053\u308d\u306b\u7bb1\u304c\u306a\u3051\u308c\u3070\u3001\u65b0\u3057\u304f\u7bb1\u3092\u4f5c\u308a\u307e\u3059\u3002\u7bb1\u3092\u4f5c\u308b\u305f\u3081\u306e\u51e6\u7406\u306f\u300121\uff5e26\u884c\u76ee\u3067\u3059\u3002\u4ee5\u524d\u306f\u3001\u3053\u306e\u4f4d\u7f6e\u306b\u3001move()\u3068button_release()\u304c\u3042\u308a\u307e\u3057\u305f\u304c\u3001\u4eca\u56de\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u3053\u308c\u3089\u306f\u5168\u90e8\u3001\u30af\u30e9\u30b9\u306e\u65b9\u3067\u51e6\u7406\u3059\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u300029\u884c\u76ee\u306b\u8ffd\u52a0\u3057\u305f\u300cBOXID\u300d\u3067\u3059\u304c\u3001Canvas\u4e0a\u306e\u9805\u76ee\u3092\u307e\u3068\u3081\u308b\u305f\u3081\u306e\u30bf\u30b0\u306b\u9023\u756a\u3092\u3064\u3051\u308b\u305f\u3081\u3060\u3051\u306e\u3082\u306e\u3067\u3059\u3002Movable\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u4f5c\u3089\u308c\u308b\u3054\u3068\u306b\u3072\u3068\u3064\u305a\u3064\u5897\u3048\u3066\u3044\u304d\u307e\u3059\u300232\u884c\u76ee\u3001global\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001BOXID\u304c\u5916\u90e8\u3067\u5ba3\u8a00\u3055\u308c\u305f\u30b0\u30ed\u30fc\u30d0\u30eb\u5909\u6570\u3060\u3068\u3044\u3046\u3053\u3068\u3092\u5ba3\u8a00\u3057\u3066\u3044\u307e\u3059\u300233\u884c\u76ee\u30671\u3092\u8db3\u3057\u3066\u9023\u756a\u304c\u5897\u3048\u308b\u3088\u3046\u306b\u3057\u3066\u300134\u884c\u76ee\u3067tag\u3092\u300cMOVABLE-\u9023\u756a\u300d\u3068\u306a\u308b\u3088\u3046\u306b\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u300235\u884c\u76ee\u300136\u884c\u76ee\u306e\u30c6\u30ad\u30b9\u30c8\u3068\u56db\u89d2\u3092\u4f5c\u6210\u3057\u3066\u3044\u308b\u3068\u3053\u308d\u3067tag\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u300039\uff5e42\u884c\u76ee\u3067tag_bind()\u3092\u4f7f\u3063\u3066\u3001\u3053\u306e\u30af\u30e9\u30b9\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u767a\u751f\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u3068\u30e1\u30bd\u30c3\u30c9\u3092\u30d0\u30a4\u30f3\u30c9\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u3053\u3067\u306e\u30dd\u30a4\u30f3\u30c8\u306ftag_bind()\u3092\u4f7f\u3063\u3066\u30bf\u30b0\u3054\u3068\u306b\u30a4\u30d9\u30f3\u30c8\u3092\u5272\u308a\u5f53\u3066\u3066\u3044\u308b\u3068\u3053\u308d\u3067\u3059\u3002\u524d\u56de\u306f\u3001\u30ad\u30e3\u30f3\u30d0\u30b9\u3054\u3068\u306b\u5272\u308a\u5f53\u3066\u3066\u3044\u305f\u306e\u3067\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u5272\u308a\u5f53\u3066\u308b\u305f\u3073\u306b\u524d\u56de\u306e\u30a4\u30d9\u30f3\u30c8\u5272\u308a\u5f53\u3066\u304c\u4e0a\u66f8\u304d\u3055\u308c\u3066\u3057\u307e\u3044\u3001\u3046\u307e\u304f\u52d5\u4f5c\u3057\u306a\u304b\u3063\u305f\u306e\u3067\u3057\u305f\u3002\u8abf\u3079\u305f\u7d50\u679c\u3001\u30ad\u30e3\u30f3\u30d0\u30b9\u3054\u3068\u3067\u3082\u300cadd=&#8221;+&#8221;\u300d\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u3064\u3051\u3066\u30d0\u30a4\u30f3\u30c9\u3059\u308b\u3053\u3068\u3067\u30a4\u30d9\u30f3\u30c8\u5272\u308a\u5f53\u3066\u304c\u4e0a\u66f8\u304d\u3055\u308c\u306a\u3044\u3068\u3044\u3046\u3053\u3068\u304c\u5206\u304b\u3063\u305f\u306e\u3067\u3059\u304c\u3001tag_bind()\u3060\u3068\u30bf\u30b0\u3054\u3068\u306e\u5272\u308a\u5f53\u3066\u306b\u306a\u308b\u306e\u3067\u3001\u3053\u3061\u3089\u306e\u65b9\u304c\u3057\u3063\u304f\u308a\u304d\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u305f\u30e1\u30bd\u30c3\u30c9\u306e\u65b9\u3067\u3059\u304c\u3001\u30a4\u30d9\u30f3\u30c8\u306f\u305d\u308c\u305e\u308c\u306e\u30bf\u30b0\u3054\u3068\u306b\u767a\u751f\u3059\u308b\u306e\u3067\u3001\u30af\u30e9\u30b9\u5185\u3067\u3053\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u9078\u629e\u3055\u308c\u305f\u304b\u3069\u3046\u304b\u3001\u3068\u3044\u3046\u5224\u5b9a\u306f\u4e0d\u8981\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000\u3042\u3068\u3001\u4eca\u56de\u306f\u53f3\u30af\u30ea\u30c3\u30af\u3067\u7bb1\u3092\u6d88\u53bb\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u307e\u3068\u3081<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000\u3044\u304b\u304c\u3067\u3057\u3087\u3046\u3001\u524d\u56de\u3088\u308a\u30b9\u30c3\u30ad\u30ea\u3057\u305f\u3068\u601d\u3044\u307e\u305b\u3093\u304b\uff1f<br>\u3044\u3084\uff5e\u3001\u307e\u305f\u81ea\u753b\u81ea\u8cdb\u304b\u306a\u3041\u3002(\u7b11)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3000\u4eca\u65e5\u3082\u6765\u3066\u304f\u3060\u3055\u3063\u3066\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3059\u3002\u77f3\u5ddd\u3055\u3093\u3067\u3059\u3002 \u3000\u3057\u3064\u3053\u304fCanvas\u306e\u79fb\u52d5\u306b\u3064\u3044\u3066\u3084\u3063\u3066\u307f\u307e\u3057\u305f\u3002\u524d\u56de\u79fb\u52d5\u3059\u308b\u305f\u3081\u306e\u30af\u30e9\u30b9\u3092\u4f5c\u3063\u305f\u3068\u304d\u306b\u3001\u79fb\u52d5\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u30af\u30e9\u30b9\u5074\u306b\u4f5c\u3063\u305f\u3051\u3069\u3001\u547c\u3073\u51fa\u3057\u306f\u30e1\u30a4\u30f3\u30af\u30e9\u30b9\u306e\u65b9\u304b\u3089 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.ishikawasekkei.com\/index.php\/2020\/07\/10\/python-tkinter-gui-programing-canvas-move4\/\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;Python tkinter GUI\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0 Canvas move4&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,13,2],"tags":[],"class_list":["post-1543","post","type-post","status-publish","format-standard","hentry","category-program","category-tkinter","category-blog"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/posts\/1543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/comments?post=1543"}],"version-history":[{"count":9,"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/posts\/1543\/revisions"}],"predecessor-version":[{"id":1553,"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/posts\/1543\/revisions\/1553"}],"wp:attachment":[{"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/media?parent=1543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/categories?post=1543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ishikawasekkei.com\/index.php\/wp-json\/wp\/v2\/tags?post=1543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}